Java常用算法總結(轉)


交換排序

冒泡排序

將最后一個元素與倒數第二個元素對比,如果最后一個元素比倒數第二個小,則交換兩個元素的位置,再用倒數第二個元素與倒數第三個元數對比,直到比到第一個元素,這樣經過第一趟排序后得到第一個最小元素。如此反復幾過N(N=length-1)次后可得到排序結果。

Java代碼  收藏代碼
  1. package sort; 
  2.  
  3. import java.util.Comparator; 
  4.  
  5. /**
  6. * 冒泡排序算法
  7. * @author jzj
  8. * @date 2009-12-9
  9. *
  10. * @param <E>
  11. */ 
  12. publicclass BubbleSort<E extends Comparable<E>> extends Sort<E> { 
  13.  
  14.     /**
  15.      * 排序算法的實現,對數組中指定的元素進行排序
  16.      * @param array 待排序的數組
  17.      * @param from 從哪里開始排序
  18.      * @param end 排到哪里
  19.      * @param c 比較器
  20.      */ 
  21.     publicvoid sort(E[] array, int from, int end, Comparator<E> c) { 
  22.         //需array.length - 1輪比較 
  23.         for (int k = 1; k < end - from + 1; k++) { 
  24.             //每輪循環中從最后一個元素開始向前起泡,直到i=k止,即i等於輪次止 
  25.             for (int i = end - from; i >= k; i--) { 
  26.                 //按照一種規則(后面元素不能小於前面元素)排序 
  27.                 if (c.compare(array[i], array[i - 1]) < 0) { 
  28.                     //如果后面元素小於了(當然是大於還是小於要看比較器實現了)前面的元素,則前后交換 
  29.                     swap(array, i, i - 1); 
  30.                 } 
  31.             } 
  32.         } 
  33.     } 
  34.  
  35.     /**
  36.     * 測試
  37.     * @param args
  38.     */ 
  39.     publicstaticvoid main(String[] args) { 
  40.         Integer[] intgArr = { 7, 2, 4, 3, 12, 1, 9, 6, 8, 5, 11, 10 }; 
  41.         BubbleSort<Integer> sort = new BubbleSort<Integer>(); 
  42.         BubbleSort.testSort(sort, intgArr); 
  43.         BubbleSort.testSort(sort, null); 
  44.     } 

快速排序

快速排序采用了分治法的思想,把大的問題分解為同類型的小問題。 一般分如下步驟: 1)選擇一個中樞元素(有很多選法,我的實現里使用第一個元素為中樞的簡單方法) 2)以該中樞元素為基准點,將小於中樞的元素放在中樞后集合的前部分,比它大的在集合后部分,待集合基本排序完成后(此時前部分元素小於后部分元素),把中樞元素放在合適的位置。 3)根據中樞元素最后確定的位置,把數組分成三部分,左邊的,右邊的,樞紐元素自己,對左邊的,右邊的分別遞歸調用快速排序算法即可。
這里的重點與難點在於第二步,實現的方式有很多種,我這里實現了三種。 第一種實現(partition1方法): 以第一個元素為中樞元素,在中樞元素后面集合中從前往后尋找第一個比中樞元素小的元素,並與第一個元素交換,然后從剩余的元素中尋找第二個比中樞元素小的 元素,並與第二位元素交換,這樣直到所有小於中樞元素找完為止,並記下最后一次放置小於中樞的元素位置minIndex(即小於中樞與大於中樞的分界), 並將中樞元素與minIndex位置元素互換,然后對中樞元素兩邊的序列進行同樣的操作。 此種實現最為簡潔,處理過程中不需要把中樞元素移來移去,只是在其它元素完成基本排序后(前部分小於后部分元素)再把中樞元素放置到適當的位置 第二種實現(partition2方法): 以第一個元素為中樞元素,剛開始時使用低指針指向中樞元素。當中樞元素在低指針位置時,此時我們判斷高指針指向的元素是否小於中樞元素,如果大於中樞元素 則高指針繼續向頭移動,如果小於則與中樞元素交換,此時中樞元素被移到了高指針位置;當中樞元素在高指針位置時,我們此時判斷低指針指向的元素是否大於中 樞元素,如果小於中樞元素則低指針繼續向尾移動,如果大於則與中樞元素交換,此時中樞元素又回到了低指針位置;這時是拿高還是低指針所指向的元素與中樞比 較時根據前面邏輯來處理,直到高低指針指向同一位置則完成一輪排序,然后再對中樞元素兩邊的序列進行同樣的操作直到排序完成 此種實現邏輯比較好理解,中樞元素的永遠在低指針或指針所指向的位置,每次找到需處理的元 素后,要與中樞交換,中樞就像皮球一樣從這里踢到那里,又從那里踢到這里。但此種實現會頻繁地交換中樞元素,性能可能不如第一種 第三種實現(partition3方法): 此種方式與前兩種方式不太一樣,同時移動高低指針,低指針向尾找出大於等於中樞的元素,而高向頭找出小於中樞的元素,待兩者都找出后交換高低指針所指向的 元素,直到高低指針指向同一位置止,然后比較中樞與高低指針所指向的元素大小,如果中樞元素大,則直接與高低指針元素交換,如果中樞元素小於等於高低指針 元素,則中樞元素與高低指針前一元素交換,完成一輪比較,然后再對中樞元素兩邊的序列進行同樣的操作直到排序完成

此種方式有點難度,在移動元素時要注意的是:與中樞相等的元素也要向集合后部移動,不然的話如[3,3,0,3,3]第一輪排序結果不准確,雖然最后結果 正確。當中樞后面的元素集合移動完成后,還得要把中樞元素放置在集合中的合適位置,這就需要找准集合中前部分與后部分的邊界,最后只能把中樞元素與最后一 個小於中樞的元素進位置互換。但此種實現方式與第一種有點像,也不需要把中樞元素調來調去的,而是待后面集合排序完成后將中樞放入適當位置

Java代碼  收藏代碼
  1. package sort; 
  2.  
  3. import java.util.Arrays; 
  4. import java.util.Comparator; 
  5.  
  6. /**
  7. * 快速排序算法
  8. * @author jzj
  9. * @date 2009-12-9
  10. *
  11. * @param <E>
  12. */ 
  13. publicclass QuickSort<E extends Comparable<E>> extends Sort<E> { 
  14.  
  15.     /**
  16.      * 排序算法的實現,對數組中指定的元素進行排序
  17.      * @param array 待排序的數組
  18.      * @param from 從哪里開始排序
  19.      * @param end 排到哪里
  20.      * @param c 比較器
  21.      */ 
  22.     publicvoid sort(E[] array, int from, int end, Comparator<E> c) { 
  23.         quickSort(array, from, end, c); 
  24.     } 
  25.  
  26.     /**
  27.      * 遞歸快速排序實現
  28.      * @param array 待排序數組
  29.      * @param low 低指針
  30.      * @param high 高指針
  31.      * @param c 比較器
  32.      */ 
  33.     privatevoid quickSort(E[] array, int low, int high, Comparator<E> c) { 
  34.         /*
  35.          * 如果分區中的低指針小於高指針時循環;如果low=higth說明數組只有一個元素,無需再處理;
  36.          * 如果low > higth,則說明上次樞紐元素的位置pivot就是low或者是higth,此種情況
  37.          * 下分區不存,也不需處理
  38.          */ 
  39.         if (low < high) { 
  40.             //對分區進行排序整理 
  41.             int pivot = partition1(array, low, high, c); 
  42.             /*
  43.              * 以pivot為邊界,把數組分成三部分[low, pivot - 1]、[pivot]、[pivot + 1, high]
  44.              * 其中[pivot]為樞紐元素,不需處理,再對[low, pivot - 1]與[pivot + 1, high]
  45.              * 各自進行分區排序整理與進一步分區
  46.              */ 
  47.             quickSort(array, low, pivot - 1, c); 
  48.             quickSort(array, pivot + 1, high, c); 
  49.         } 
  50.  
  51.     } 
  52.  
  53.     /**
  54.      * 實現一
  55.      *
  56.      * @param array 待排序數組
  57.      * @param low 低指針
  58.      * @param high 高指針
  59.      * @param c 比較器
  60.      * @return int 調整后中樞位置
  61.      */ 
  62.     privateint partition1(E[] array, int low, int high, Comparator<E> c) { 
  63.         E pivotElem = array[low];//以第一個元素為中樞元素 
  64.         //從前向后依次指向比中樞元素小的元素,剛開始時指向中樞,也是小於與大小中樞的元素的分界點 
  65.         int border = low; 
  66.  
  67.         /*
  68.          * 在中樞元素后面的元素中查找小於中樞元素的所有元素,並依次從第二個位置從前往后存放
  69.          * 注,這里最好使用i來移動,如果直接移動low的話,最后不知道數組的邊界了,但后面需要
  70.          * 知道數組的邊界
  71.          */ 
  72.         for (int i = low + 1; i <= high; i++) { 
  73.             //如果找到一個比中樞元素小的元素 
  74.             if (c.compare(array[i], pivotElem) < 0) { 
  75.                 swap(array, ++border, i);//border前移,表示有小於中樞元素的元素 
  76.             } 
  77.         } 
  78.         /*
  79.          * 如果border沒有移動時說明說明后面的元素都比中樞元素要大,border與low相等,此時是
  80.          * 同一位置交換,是否交換都沒關系;當border移到了high時說明所有元素都小於中樞元素,此
  81.          * 時將中樞元素與最后一個元素交換即可,即low與high進行交換,大的中樞元素移到了 序列最
  82.          * 后;如果 low <minIndex< high,表 明中樞后面的元素前部分小於中樞元素,而后部分大於
  83.          * 中樞元素,此時中樞元素與前部分數組中最后一個小於它的元素交換位置,使得中樞元素放置在
  84.          * 正確的位置
  85.          */ 
  86.         swap(array, border, low); 
  87.         return border; 
  88.     } 
  89.  
  90.     /**
  91.      * 實現二
  92.      *
  93.      * @param array 待排序數組
  94.      * @param low 待排序區低指針
  95.      * @param high 待排序區高指針
  96.      * @param c 比較器
  97.      * @return int 調整后中樞位置
  98.      */ 
  99.     privateint partition2(E[] array, int low, int high, Comparator<E> c) { 
  100.         int pivot = low;//中樞元素位置,我們以第一個元素為中樞元素 
  101.         //退出條件這里只可能是 low = high 
  102.         while (true) { 
  103.             if (pivot != high) {//如果中樞元素在低指針位置時,我們移動高指針 
  104.                 //如果高指針元素小於中樞元素時,則與中樞元素交換 
  105.                 if (c.compare(array[high], array[pivot]) < 0) { 
  106.                     swap(array, high, pivot); 
  107.                     //交換后中樞元素在高指針位置了 
  108.                     pivot = high; 
  109.                 } else {//如果未找到小於中樞元素,則高指針前移繼續找 
  110.                     high--; 
  111.                 } 
  112.             } else {//否則中樞元素在高指針位置 
  113.                 //如果低指針元素大於中樞元素時,則與中樞元素交換 
  114.                 if (c.compare(array[low], array[pivot]) > 0) { 
  115.                     swap(array, low, pivot); 
  116.                     //交換后中樞元素在低指針位置了 
  117.                     pivot = low; 
  118.                 } else {//如果未找到大於中樞元素,則低指針后移繼續找 
  119.                     low++; 
  120.                 } 
  121.             } 
  122.             if (low == high) { 
  123.                 break
  124.             } 
  125.         } 
  126.         //返回中樞元素所在位置,以便下次分區 
  127.         return pivot; 
  128.     } 
  129.  
  130.     /**
  131.      * 實現三
  132.      *
  133.      * @param array 待排序數組
  134.      * @param low 待排序區低指針
  135.      * @param high 待排序區高指針
  136.      * @param c 比較器
  137.      * @return int 調整后中樞位置
  138.      */ 
  139.     privateint partition3(E[] array, int low, int high, Comparator<E> c) { 
  140.         int pivot = low;//中樞元素位置,我們以第一個元素為中樞元素 
  141.         low++; 
  142.         //----調整高低指針所指向的元素順序,把小於中樞元素的移到前部分,大於中樞元素的移到后面部分 
  143.         //退出條件這里只可能是 low = high 
  144.  
  145.         while (true) { 
  146.             //如果高指針未超出低指針 
  147.             while (low < high) { 
  148.                 //如果低指針指向的元素大於或等於中樞元素時表示找到了,退出,注:等於時也要后移 
  149.                 if (c.compare(array[low], array[pivot]) >= 0) { 
  150.                     break
  151.                 } else {//如果低指針指向的元素小於中樞元素時繼續找 
  152.                     low++; 
  153.                 } 
  154.             } 
  155.  
  156.             while (high > low) { 
  157.                 //如果高指針指向的元素小於中樞元素時表示找到,退出 
  158.                 if (c.compare(array[high], array[pivot]) < 0) { 
  159.                     break
  160.                 } else {//如果高指針指向的元素大於中樞元素時繼續找 
  161.                     high--; 
  162.                 } 
  163.             } 
  164.             //退出上面循環時 low = high 
  165.             if (low == high) { 
  166.                 break
  167.             } 
  168.  
  169.             swap(array, low, high); 
  170.         } 
  171.  
  172.         //----高低指針所指向的元素排序完成后,還得要把中樞元素放到適當的位置 
  173.         if (c.compare(array[pivot], array[low]) > 0) { 
  174.             //如果退出循環時中樞元素大於了低指針或高指針元素時,中樞元素需與low元素交換 
  175.             swap(array, low, pivot); 
  176.             pivot = low; 
  177.         } elseif (c.compare(array[pivot], array[low]) <= 0) { 
  178.             swap(array, low - 1, pivot); 
  179.             pivot = low - 1
  180.         } 
  181.  
  182.         //返回中樞元素所在位置,以便下次分區 
  183.         return pivot; 
  184.     } 
  185.  
  186.     /**
  187.     * 測試
  188.     * @param args
  189.     */ 
  190.     publicstaticvoid main(String[] args) { 
  191.         Integer[] intgArr = { 3, 1, 1, 1, 1, 1, 1 }; 
  192.         QuickSort<Integer> sort = new QuickSort<Integer>(); 
  193.         QuickSort.testSort(sort, intgArr); 
  194.         QuickSort.testSort(sort, null); 
  195.     } 
  196. }  

歸並排序

Java代碼  收藏代碼
  1. package sort; 
  2.  
  3. import java.lang.reflect.Array; 
  4. import java.util.Comparator; 
  5.  
  6. /**
  7. * 歸並排序算法
  8. * @author jzj
  9. * @date 2009-12-11
  10. *
  11. * @param <E>
  12. */ 
  13. publicclass MergeSort<E extends Comparable<E>> extends Sort<E> { 
  14.  
  15.     /**
  16.      * 排序算法的實現,對數組中指定的元素進行排序
  17.      * @param array 待排序的數組
  18.      * @param from 從哪里開始排序
  19.      * @param end 排到哪里
  20.      * @param c 比較器
  21.      */ 
  22.     publicvoid sort(E[] arr, int from, int end, Comparator<E> c) { 
  23.         partition(arr, from, end, c); 
  24.     } 
  25.  
  26.     /**
  27.      * 遞歸划分數組
  28.      * @param arr
  29.      * @param from
  30.      * @param end
  31.      * @param c void
  32.      */ 
  33.     privatevoid partition(E[] arr, int from, int end, Comparator<E> c) { 
  34.         //划分到數組只有一個元素時才不進行再划分 
  35.         if (from < end) { 
  36.             //從中間划分成兩個數組 
  37.             int mid = (from + end) / 2
  38.             partition(arr, from, mid, c); 
  39.             partition(arr, mid + 1, end, c); 
  40.             //合並划分后的兩個數組 
  41.             merge(arr, from, end, mid, c); 
  42.         } 
  43.     } 
  44.  
  45.     /**
  46.      * 數組合並,合並過程中對兩部分數組進行排序
  47.      * 前后兩部分數組里是有序的
  48.      * @param arr
  49.      * @param from
  50.      * @param end
  51.      * @param mid
  52.      * @param c void
  53.      */ 
  54.     privatevoid merge(E[] arr, int from, int end, int mid, Comparator<E> c) { 
  55.         E[] tmpArr = (E[]) Array.newInstance(arr[0].getClass(), end - from + 1); 
  56.         int tmpArrIndex = 0;//指向臨時數組 
  57.         int part1ArrIndex = from;//指向第一部分數組 
  58.         int part2ArrIndex = mid + 1;//指向第二部分數組 
  59.  
  60.         //由於兩部分數組里是有序的,所以每部分可以從第一個元素依次取到最后一個元素,再對兩部分 
  61.         //取出的元素進行比較。只要某部分數組元素取完后,退出循環 
  62.         while ((part1ArrIndex <= mid) && (part2ArrIndex <= end)) { 
  63.             //從兩部分數組里各取一個進行比較,取最小一個並放入臨時數組中 
  64.             if (c.compare(arr[part1ArrIndex], arr[part2ArrIndex]) < 0) { 
  65.                 //如果第一部分數組元素小,則將第一部分數組元素放入臨時數組中,並且臨時數組指針 
  66.                 //tmpArrIndex下移一個以做好下次存儲位置准備,前部分數組指針part1ArrIndex 
  67.                 //也要下移一個以便下次取出下一個元素與后部分數組元素比較 
  68.                 tmpArr[tmpArrIndex++] = arr[part1ArrIndex++]; 
  69.             } else
  70.                 //如果第二部分數組元素小,則將第二部分數組元素放入臨時數組中 
  71.                 tmpArr[tmpArrIndex++] = arr[part2ArrIndex++]; 
  72.             } 
  73.         } 
  74.         //由於退出循環后,兩部分數組中可能有一個數組元素還未處理完,所以需要額外的處理,當然不可 
  75.         //能兩部分數組都有未處理完的元素,所以下面兩個循環最多只有一個會執行,並且都是大於已放入 
  76.         //臨時數組中的元素 
  77.         while (part1ArrIndex <= mid) { 
  78.             tmpArr[tmpArrIndex++] = arr[part1ArrIndex++]; 
  79.         } 
  80.         while (part2ArrIndex <= end) { 
  81.             tmpArr[tmpArrIndex++] = arr[part2ArrIndex++]; 
  82.         } 
  83.  
  84.         //最后把臨時數組拷貝到源數組相同的位置 
  85.         System.arraycopy(tmpArr, 0, arr, from, end - from + 1); 
  86.     } 
  87.  
  88.     /**
  89.      * 測試
  90.      * @param args
  91.      */ 
  92.     publicstaticvoid main(String[] args) { 
  93.         Integer[] intgArr = { 5, 9, 1, 4, 1, 2, 6, 3, 8, 0, 7 }; 
  94.         MergeSort<Integer> insertSort = new MergeSort<Integer>(); 
  95.         Sort.testSort(insertSort, intgArr); 
  96.         Sort.testSort(insertSort, null); 
  97.     } 
  98. }  

基數排序

基數排序的主要思路是,將所有待比較數值(注意,必須是正整數)統一為同樣的數位長度,數位較短的數前面補零. 然后, 從最低位開始, 依次進行一次穩定排序.這樣從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列.

它的理論比較容易理解,但實現卻有一點繞。

Java代碼  收藏代碼
  1. package sort; 
  2.  
  3. import java.util.Arrays; 
  4.  
  5. publicclass RadixSort { 
  6.  
  7.     /**
  8.      * 取數x上的第d位數字
  9.      * @param x 數
  10.      * @param d 第幾位,從低位到高位
  11.      * @return
  12.      */ 
  13.     publicint digit(long x, long d) { 
  14.  
  15.         long pow = 1
  16.         while (--d > 0) { 
  17.             pow *= 10
  18.         } 
  19.         return (int) (x / pow % 10); 
  20.     } 
  21.  
  22.     /**
  23.      * 基數排序實現,以升序排序(下面程序中的位記錄器count中,從第0個元素到第9個元素依次用來
  24.      * 記錄當前比較位是0的有多少個..是9的有多少個數,而降序時則從第0個元素到第9個元素依次用來
  25.      * 記錄當前比較位是9的有多少個..是0的有多少個數)
  26.      * @param arr 待排序數組
  27.      * @param digit 數組中最大數的位數
  28.      * @return
  29.      */ 
  30.     publiclong[] radixSortAsc(long[] arr) { 
  31.         //從低位往高位循環 
  32.         for (int d = 1; d <= getMax(arr); d++) { 
  33.             //臨時數組,用來存放排序過程中的數據 
  34.             long[] tmpArray = newlong[arr.length]; 
  35.             //位記數器,從第0個元素到第9個元素依次用來記錄當前比較位是0的有多少個..是9的有多少個數 
  36.             int[] count = newint[10]; 
  37.             //開始統計0有多少個,並存儲在第0位,再統計1有多少個,並存儲在第1位..依次統計到9有多少個 
  38.             for (int i = 0; i < arr.length; i++) { 
  39.                 count[digit(arr[i], d)] += 1
  40.             } 
  41.             /*
  42.              * 比如某次經過上面統計后結果為:[0, 2, 3, 3, 0, 0, 0, 0, 0, 0]則經過下面計算后 結果為:
  43.              * [0, 2, 5, 8, 8, 8, 8, 8, 8, 8]但實質上只有如下[0, 2, 5, 8, 0, 0, 0, 0, 0, 0]中
  44.              * 非零數才用到,因為其他位不存在,它們分別表示如下:2表示比較位為1的元素可以存放在索引為1、0的
  45.              * 位置,5表示比較位為2的元素可以存放在4、3、2三個(5-2=3)位置,8表示比較位為3的元素可以存放在
  46.              * 7、6、5三個(8-5=3)位置
  47.              */ 
  48.             for (int i = 1; i < 10; i++) { 
  49.                 count[i] += count[i - 1]; 
  50.             } 
  51.  
  52.             /*
  53.              * 注,這里只能從數組后往前循環,因為排序時還需保持以前的已排序好的 順序,不應該打
  54.              * 亂原來已排好的序,如果從前往后處理,則會把原來在前面會擺到后面去,因為在處理某個
  55.              * 元素的位置時,位記數器是從大到到小(count[digit(arr[i], d)]--)的方式來處
  56.              * 理的,即先存放索引大的元素,再存放索引小的元素,所以需從最后一個元素開始處理。
  57.              * 如有這樣的一個序列[212,213,312],如果按照從第一個元素開始循環的話,經過第一輪
  58.              * 后(個位)排序后,得到這樣一個序列[312,212,213],第一次好像沒什么問題,但問題會
  59.              * 從第二輪開始出現,第二輪排序后,會得到[213,212,312],這樣個位為3的元素本應該
  60.              * 放在最后,但經過第二輪后卻排在了前面了,所以出現了問題
  61.              */ 
  62.             for (int i = arr.length - 1; i >= 0; i--) {//只能從最后一個元素往前處理 
  63.                 //for (int i = 0; i < arr.length; i++) {//不能從第一個元素開始循環 
  64.                 tmpArray[count[digit(arr[i], d)] - 1] = arr[i]; 
  65.                 count[digit(arr[i], d)]--; 
  66.             } 
  67.  
  68.             System.arraycopy(tmpArray, 0, arr, 0, tmpArray.length); 
  69.         } 
  70.         return arr; 
  71.     } 
  72.  
  73.     /**
  74.      * 基數排序實現,以降序排序(下面程序中的位記錄器count中,從第0個元素到第9個元素依次用來
  75.      * 記錄當前比較位是0的有多少個..是9的有多少個數,而降序時則從第0個元素到第9個元素依次用來
  76.      * 記錄當前比較位是9的有多少個..是0的有多少個數)
  77.      * @param arr 待排序數組
  78.      * @return
  79.      */ 
  80.     publiclong[] radixSortDesc(long[] arr) { 
  81.         for (int d = 1; d <= getMax(arr); d++) { 
  82.             long[] tmpArray = newlong[arr.length]; 
  83.             //位記數器,從第0個元素到第9個元素依次用來記錄當前比較位是9的有多少個..是0的有多少個數 
  84.             int[] count = newint[10]; 
  85.             //開始統計0有多少個,並存儲在第9位,再統計1有多少個,並存儲在第8位..依次統計 
  86.             //到9有多少個,並存儲在第0位 
  87.             for (int i = 0; i < arr.length; i++) { 
  88.                 count[9 - digit(arr[i], d)] += 1
  89.             } 
  90.  
  91.             for (int i = 1; i < 10; i++) { 
  92.                 count[i] += count[i - 1]; 
  93.             } 
  94.  
  95.             for (int i = arr.length - 1; i >= 0; i--) { 
  96.                 tmpArray[count[9 - digit(arr[i], d)] - 1] = arr[i]; 
  97.                 count[9 - digit(arr[i], d)]--; 
  98.             } 
  99.  
  100.             System.arraycopy(tmpArray, 0, arr, 0, tmpArray.length); 
  101.         } 
  102.         return arr; 
  103.     } 
  104.  
  105.     privateint getMax(long[] array) { 
  106.         int maxlIndex = 0
  107.         for (int j = 1; j < array.length; j++) { 
  108.             if (array[j] > array[maxlIndex]) { 
  109.                 maxlIndex = j; 
  110.             } 
  111.         } 
  112.         return String.valueOf(array[maxlIndex]).length(); 
  113.     } 
  114.  
  115.     publicstaticvoid main(String[] args) { 
  116.         long[] ary = newlong[] { 123, 321, 132, 212, 213, 312, 21, 223 }; 
  117.         RadixSort rs = new RadixSort(); 
  118.         System.out.println("升 - " + Arrays.toString(rs.radixSortAsc(ary))); 
  119.  
  120.         ary = newlong[] { 123, 321, 132, 212, 213, 312, 21, 223 }; 
  121.         System.out.println("降 - " + Arrays.toString(rs.radixSortDesc(ary))); 
  122.     } 

時間復雜度與空間復雜度對比表

 

原文:http://jiangzhengjun.iteye.com/blog/547735

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM