<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我思故我強

    java排序(轉)

    package com.softeem.jbs.lesson4;


    import java.util.Random;


    /**

    * 排序測試類

    *

    * 排序算法的分類如下:

    * 1.插入排序(直接插入排序、折半插入排序、希爾排序);

    * 2.交換排序(冒泡泡排序、快速排序);

    * 3.選擇排序(直接選擇排序、堆排序);

    * 4.歸并排序;

    * 5.基數排序。

    *

    * 關于排序方法的選擇:

    * (1)若n較小(如n≤50),可采用直接插入或直接選擇排序。

    *  當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少于直接插人,應選直接選擇排序為宜。

    * (2)若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;

    * (3)若n較大,則應采用時間復雜度為O(nlgn)的排序方法:快速排序、堆排序或歸并排序。

    *

    */

    public class SortTest {


    ?????? /**

    ??????? * 初始化測試數組的方法

    ??????? * @return 一個初始化好的數組

    ??????? */

    ?????? public int[] createArray() {

    ????????????? Random random = new Random();

    ????????????? int[] array = new int[10];

    ????????????? for (int i = 0; i < 10; i++) {

    ???????????????????? array[i] = random.nextInt(100) - random.nextInt(100);//生成兩個隨機數相減,保證生成的數中有負數

    ????????????? }

    ????????????? System.out.println("==========原始序列==========");

    ????????????? printArray(array);

    ????????????? return array;

    ?????? }


    ?????? /**

    ??????? * 打印數組中的元素到控制臺

    ??????? * @param source

    ??????? */

    ?????? public void printArray(int[] data) {

    ????????????? for (int i : data) {

    ???????????????????? System.out.print(i + " ");

    ????????????? }

    ????????????? System.out.println();

    ?????? }


    ?????? /**

    ??????? * 交換數組中指定的兩元素的位置

    ??????? * @param data

    ??????? * @param x

    ??????? * @param y

    ??????? */

    ?????? private void swap(int[] data, int x, int y) {

    ????????????? int temp = data[x];

    ????????????? data[x] = data[y];

    ????????????? data[y] = temp;

    ?????? }


    ?????? /**

    ??????? * 冒泡排序----交換排序的一種

    ??????? * 方法:相鄰兩元素進行比較,如有需要則進行交換,每完成一次循環就將最大元素排在最后(如從小到大排序),下一次循環是將其他的數進行類似操作。

    ??????? * 性能:比較次數O(n^2),n^2/2;交換次數O(n^2),n^2/4

    ??????? *

    ??????? * @param data 要排序的數組

    ??????? * @param sortType 排序類型

    ??????? * @return

    ??????? */

    ?????? public void bubbleSort(int[] data, String sortType) {

    ????????????? if (sortType.equals("asc")) { //正排序,從小排到大

    ???????????????????? //比較的輪數

    ???????????????????? for (int i = 1; i < data.length; i++) {

    ??????????????????????????? //將相鄰兩個數進行比較,較大的數往后冒泡

    ??????????????????????????? for (int j = 0; j < data.length - i; j++) {

    ?????????????????????????????????? if (data[j] > data[j + 1]) {

    ????????????????????????????????????????? //交換相鄰兩個數

    ????????????????????????????????????????? swap(data, j, j + 1);

    ?????????????????????????????????? }

    ??????????????????????????? }

    ???????????????????? }

    ????????????? } else if (sortType.equals("desc")) { //倒排序,從大排到小

    ???????????????????? //比較的輪數

    ???????????????????? for (int i = 1; i < data.length; i++) {

    ??????????????????????????? //將相鄰兩個數進行比較,較大的數往后冒泡

    ??????????????????????????? for (int j = 0; j < data.length - i; j++) {

    ?????????????????????????????????? if (data[j] < data[j + 1]) {

    ????????????????????????????????????????? //交換相鄰兩個數

    ????????????????????????????????????????? swap(data, j, j + 1);

    ?????????????????????????????????? }

    ??????????????????????????? }

    ???????????????????? }

    ????????????? } else {

    ???????????????????? System.out.println("您輸入的排序類型錯誤!");

    ????????????? }

    ????????????? printArray(data);//輸出冒泡排序后的數組值

    ?????? }


    ?????? /**

    ??????? * 直接選擇排序法----選擇排序的一種

    ??????? * 方法:每一趟從待排序的數據元素中選出最小(或最大)的一個元素, 順序放在已排好序的數列的最后,直到全部待排序的數據元素排完。

    ??????? * 性能:比較次數O(n^2),n^2/2

    ??????? *?????? 交換次數O(n),n

    ??????? *?????? 交換次數比冒泡排序少多了,由于交換所需CPU時間比比較所需的CUP時間多,所以選擇排序比冒泡排序快。

    ??????? *?????? 但是N比較大時,比較所需的CPU時間占主要地位,所以這時的性能和冒泡排序差不太多,但毫無疑問肯定要快些。

    ??????? *

    ??????? * @param data 要排序的數組

    ??????? * @param sortType 排序類型

    ??????? * @return

    ??????? */

    ?????? public void selectSort(int[] data, String sortType) {


    ????????????? if (sortType.equals("asc")) { //正排序,從小排到大

    ???????????????????? int index;

    ???????????????????? for (int i = 1; i < data.length; i++) {

    ??????????????????????????? index = 0;

    ??????????????????????????? for (int j = 1; j <= data.length - i; j++) {

    ?????????????????????????????????? if (data[j] > data[index]) {

    ????????????????????????????????????????? index = j;


    ?????????????????????????????????? }

    ??????????????????????????? }

    ??????????????????????????? //交換在位置data.length-i和index(最大值)兩個數

    ??????????????????????????? swap(data, data.length - i, index);

    ???????????????????? }

    ????????????? } else if (sortType.equals("desc")) { //倒排序,從大排到小

    ???????????????????? int index;

    ???????????????????? for (int i = 1; i < data.length; i++) {

    ??????????????????????????? index = 0;

    ??????????????????????????? for (int j = 1; j <= data.length - i; j++) {

    ?????????????????????????????????? if (data[j] < data[index]) {

    ????????????????????????????????????????? index = j;


    ?????????????????????????????????? }

    ??????????????????????????? }

    ??????????????????????????? //交換在位置data.length-i和index(最大值)兩個數

    ??????????????????????????? swap(data, data.length - i, index);

    ???????????????????? }

    ????????????? } else {

    ???????????????????? System.out.println("您輸入的排序類型錯誤!");

    ????????????? }

    ????????????? printArray(data);//輸出直接選擇排序后的數組值

    ?????? }


    ?????? /**

    ??????? * 插入排序

    ??????? * 方法:將一個記錄插入到已排好序的有序表(有可能是空表)中,從而得到一個新的記錄數增1的有序表。

    ??????? * 性能:比較次數O(n^2),n^2/4

    ??????? *?????? 復制次數O(n),n^2/4

    ??????? *?????? 比較次數是前兩者的一般,而復制所需的CPU時間較交換少,所以性能上比冒泡排序提高一倍多,而比選擇排序也要快。

    ??????? *

    ??????? * @param data 要排序的數組

    ??????? * @param sortType 排序類型

    ??????? */

    ?????? public void insertSort(int[] data, String sortType) {

    ????????????? if (sortType.equals("asc")) { //正排序,從小排到大

    ???????????????????? //比較的輪數

    ???????????????????? for (int i = 1; i < data.length; i++) {

    ??????????????????????????? //保證前i+1個數排好序

    ??????????????????????????? for (int j = 0; j < i; j++) {

    ?????????????????????????????????? if (data[j] > data[i]) {

    ????????????????????????????????????????? //交換在位置j和i兩個數

    ????????????????????????????????????????? swap(data, i, j);

    ?????????????????????????????????? }

    ??????????????????????????? }

    ???????????????????? }

    ????????????? } else if (sortType.equals("desc")) { //倒排序,從大排到小

    ???????????????????? //比較的輪數

    ???????????????????? for (int i = 1; i < data.length; i++) {

    ??????????????????????????? //保證前i+1個數排好序

    ??????????????????????????? for (int j = 0; j < i; j++) {

    ?????????????????????????????????? if (data[j] < data[i]) {

    ????????????????????????????????????????? //交換在位置j和i兩個數

    ????????????????????????????????????????? swap(data, i, j);

    ?????????????????????????????????? }

    ??????????????????????????? }

    ???????????????????? }

    ????????????? } else {

    ???????????????????? System.out.println("您輸入的排序類型錯誤!");

    ????????????? }

    ????????????? printArray(data);//輸出插入排序后的數組值

    ?????? }


    ?????? /**

    ??????? * 反轉數組的方法

    ??????? * @param data 源數組

    ??????? */

    ?????? public void reverse(int[] data) {


    ????????????? int length = data.length;

    ????????????? int temp = 0;//臨時變量


    ????????????? for (int i = 0; i < length / 2; i++) {

    ???????????????????? temp = data[i];

    ???????????????????? data[i] = data[length - 1 - i];

    ???????????????????? data[length - 1 - i] = temp;

    ????????????? }

    ????????????? printArray(data);//輸出到轉后數組的值

    ?????? }


    ?????? /**

    ??????? * 快速排序

    ??????? * 快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分為兩個子序列(sub-lists)。

    ??????? * 步驟為:

    ??????? * 1. 從數列中挑出一個元素,稱為 "基準"(pivot),

    ??????? * 2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分割之后,該基準是它的最后位置。這個稱為分割(partition)操作。

    ??????? * 3. 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。

    ??????? * 遞回的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞回下去,但是這個算法總會結束,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。

    ??????? * @param data 待排序的數組

    ??????? * @param low

    ??????? * @param high

    ??????? * @see SortTest#qsort(int[], int, int)

    ??????? * @see SortTest#qsort_desc(int[], int, int)

    ??????? */

    ?????? public void quickSort(int[] data, String sortType) {

    ????????????? if (sortType.equals("asc")) { //正排序,從小排到大

    ???????????????????? qsort_asc(data, 0, data.length - 1);

    ????????????? } else if (sortType.equals("desc")) { //倒排序,從大排到小

    ???????????????????? qsort_desc(data, 0, data.length - 1);

    ????????????? } else {

    ???????????????????? System.out.println("您輸入的排序類型錯誤!");

    ????????????? }

    ?????? }


    ?????? /**

    ??????? * 快速排序的具體實現,排正序

    ??????? * @param data

    ??????? * @param low

    ??????? * @param high

    ??????? */

    ?????? private void qsort_asc(int data[], int low, int high) {

    ????????????? int i, j, x;

    ????????????? if (low < high) { //這個條件用來結束遞歸

    ???????????????????? i = low;

    ???????????????????? j = high;

    ???????????????????? x = data[i];

    ???????????????????? while (i < j) {

    ??????????????????????????? while (i < j && data[j] > x) {

    ?????????????????????????????????? j--; //從右向左找第一個小于x的數

    ??????????????????????????? }

    ??????????????????????????? if (i < j) {

    ?????????????????????????????????? data[i] = data[j];

    ?????????????????????????????????? i++;

    ??????????????????????????? }

    ??????????????????????????? while (i < j && data[i] < x) {

    ?????????????????????????????????? i++; //從左向右找第一個大于x的數

    ??????????????????????????? }

    ??????????????????????????? if (i < j) {

    ?????????????????????????????????? data[j] = data[i];

    ?????????????????????????????????? j--;

    ??????????????????????????? }

    ???????????????????? }

    ???????????????????? data[i] = x;

    ???????????????????? qsort_asc(data, low, i - 1);

    ???????????????????? qsort_asc(data, i + 1, high);

    ????????????? }

    ?????? }


    ??

    posted on 2009-07-11 23:12 李云澤 閱讀(141) 評論(0)  編輯  收藏 所屬分類: 算法


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲欧洲国产综合AV无码久久| 免费看少妇高潮成人片| 中文字幕免费在线观看| 久久久亚洲精品国产| 久久久久久久99精品免费观看| 99热在线精品免费全部my| 91亚洲国产成人久久精品| 999在线视频精品免费播放观看| 免费少妇a级毛片人成网| 羞羞漫画登录页面免费| 国产成人免费全部网站| 添bbb免费观看高清视频| jizzjizz亚洲| 99久久99这里只有免费的精品 | 精品免费AV一区二区三区| 国产精品二区三区免费播放心| 国产V亚洲V天堂无码| 免费网站观看WWW在线观看| 亚洲国产a∨无码中文777| 久久免费观看国产精品88av| 久久久久亚洲av无码专区喷水 | 美女扒开屁股让男人桶爽免费| 无码人妻丰满熟妇区免费 | 国产精品免费观看| 亚洲偷偷自拍高清| 国产成人精品123区免费视频| 亚洲最大的成网4438| fc2免费人成在线视频| 麻豆亚洲AV永久无码精品久久| 免费的黄网站男人的天堂| 91免费资源网站入口| 亚洲日韩精品一区二区三区无码 | 精品无码人妻一区二区免费蜜桃| 亚洲人成电影网站国产精品| 少妇性饥渴无码A区免费| 亚洲沟沟美女亚洲沟沟| 国产又黄又爽又猛的免费视频播放 | 欧美大尺寸SUV免费| 黄人成a动漫片免费网站| 一二三四免费观看在线视频中文版| 亚洲国产精品成人精品无码区|