java 排序算法

  1. import java.util.Arrays; 
  2.  
  3. /** 
  4.  * 各種排序方法 
  5.  *  
  6.  * @author zhezi 
  7.  *  
  8.  */ 
  9. public class Sort { 
  10.  
  11.     /** 
  12.      * 1.直接插入排序,asc 
  13.      */ 
  14.     public void insertSort(int[] arr, int low, int high) { 
  15.         for (int i = low + 1; i < high; i++) { 
  16.             if (arr[i] < arr[i - 1]) { // i < i-1 
  17.                 int temp = arr[i]; 
  18.                 arr[i] = arr[i - 1]; // i-1 後移 
  19.                 int j = i - 2
  20.                 for (; j >= low && (temp < arr[j]); j--) { // i 與 
  21.                     // i-1之前的元素進行比較(找出最小值) 
  22.                     arr[j + 1] = arr[j]; // i-2 後移到 i-1 
  23.                 } 
  24.                 arr[j + 1] = temp; // i插入到合適位置 
  25.             } 
  26.         } 
  27.         /** 輸出 **/ 
  28.         for (int k = 0; k < arr.length; k++) { 
  29.             System.out.print(arr[k] + ","); 
  30.         } 
  31.         System.out.println(); 
  32.     } 
  33.  
  34.     /** 
  35.      * 2.折半插入排序(二分查找) 
  36.      */ 
  37.     public void binInsertSort(int[] arr, int low, int high) { 
  38.         for (int i = low + 1; i < high; i++) { 
  39.             int temp = arr[i]; 
  40.             int hi = i - 1
  41.             int lo = low; // 設置初始期間 
  42.             while (lo <= hi) { 
  43.                 int mid = (lo + hi) / 2
  44.                 if (temp < arr[mid]) { 
  45.                     hi = mid - 1
  46.                 } else { 
  47.                     lo = mid + 1
  48.                 } 
  49.             } 
  50.             for (int j = i - 1; j > hi; j--) { // 移動元素 
  51.                 arr[j + 1] = arr[j]; 
  52.             } 
  53.             arr[hi + 1] = temp; // 插入元素 
  54.         } 
  55.         // 輸出 
  56.         for (int k = 0; k < arr.length; k++) { 
  57.             System.out.print(arr[k] + ","); 
  58.         } 
  59.         System.out.println(); 
  60.     } 
  61.  
  62.     /** 
  63.      * 3.希爾排序 
  64.      */ 
  65.     int[] delta = { 321 }; 
  66.  
  67.     /** 步長序列,步長值必須互質,且最後一個步長值必須爲1 **/ 
  68.  
  69.     public void shellSort(int[] arr, int low, int high, int[] delta) { 
  70.         for (int i = 0; i < delta.length; i++) { 
  71.             shellInsert(arr, low, high, delta[i]); 
  72.         } 
  73.         for (int k = 0; k < arr.length; k++) { 
  74.             System.out.print(arr[k] + ","); 
  75.         } 
  76.         System.out.println(); 
  77.     } 
  78.  
  79.     public void shellInsert(int[] arr, int low, int high, int deltaK) { 
  80.         for (int i = low + deltaK; i < high; i++) { 
  81.             if (arr[i] < arr[i - deltaK]) { 
  82.                 int temp = arr[i]; 
  83.                 int j = i - deltaK; 
  84.                 for (; j >= low && temp < arr[j]; j = j - deltaK) { 
  85.                     arr[j + deltaK] = arr[j]; 
  86.                 } 
  87.                 arr[j + deltaK] = temp; 
  88.             } 
  89.         } 
  90.     } 
  91.  
  92.     /** 
  93.      * 4.冒泡排序                    --兩兩位置相比較,找到最大的,放到最後 
  94.      */ 
  95.     public void bubbleSort(int[] arr, int low, int high) { 
  96.         for (int i = low; i < high; i++) { // 循環次數 
  97.             for (int j = low; j < high - i - 1; j++) { // 兩兩位置相比較,找出最大的 
  98.                 if (arr[j] > arr[j + 1]) { 
  99.                     int temp = arr[j]; 
  100.                     arr[j] = arr[j + 1]; 
  101.                     arr[j + 1] = temp; 
  102.                 } 
  103.             } 
  104.         } 
  105.         for (int k = 0; k < arr.length; k++) { 
  106.             System.out.print(arr[k] + ","); 
  107.         } 
  108.         System.out.println(); 
  109.     } 
  110.  
  111.     /** 
  112.      * 5.快速排序            ---找到樞軸元素,分爲兩個子序列,左邊都比樞軸小,右邊都比樞軸大,再對子序列排序 
  113.      */ 
  114.     public void quickSort(int[] arr, int low, int high) { 
  115.         if (low < high) { 
  116.             int pa = partition(arr, low, high); 
  117.             quickSort(arr, low, pa - 1); 
  118.             quickSort(arr, pa + 1, high); 
  119.         } 
  120.         /** 輸出 **/ 
  121.         for (int k = 0; k < arr.length; k++) { 
  122.             System.out.print(arr[k] + ","); 
  123.         } 
  124.         System.out.println(); 
  125.     } 
  126.  
  127.     /** 將序列劃分爲兩列,返回樞軸元素的位置 **/ 
  128.     public int partition(int[] arr, int low, int high) { 
  129.         int pivot = arr[low]; // 使用arr[low]作爲樞軸元素 
  130.         while (low < high) { // 從兩端向內掃描 
  131.             while (low < high && (arr[high] >= pivot)) { 
  132.                 high--; 
  133.             } 
  134.             arr[low] = arr[high]; // 將小於pivot的元素移向低端 
  135.             while (low < high && (arr[low] <= pivot)) { 
  136.                 low++; 
  137.             } 
  138.             arr[high] = arr[low]; // 將大於pivot的元素移向高端 
  139.         } 
  140.         arr[low] = pivot; 
  141.         return low; 
  142.     } 
  143.  
  144.     /** 
  145.      * 6.簡單選擇排序          ---每一次遍歷,找到最小值放到前面 
  146.      */ 
  147.     public void selectSort(int[] arr, int low, int high) { 
  148.         for (int i = low; i < high; i++) { 
  149.             int min = i; 
  150.             for (int j = min + 1; j < high; j++) { 
  151.                 if (arr[j] < arr[min]) { 
  152.                     min = j; 
  153.                 } 
  154.             } 
  155.             if (i != min) { 
  156.                 int temp = arr[i]; 
  157.                 arr[i] = arr[min]; 
  158.                 arr[min] = temp; 
  159.             } 
  160.         } 
  161.         /** 輸出 **/ 
  162.         for (int k = 0; k < arr.length; k++) { 
  163.             System.out.print(arr[k] + ","); 
  164.         } 
  165.         System.out.println(); 
  166.     } 
  167.  
  168.     /** 
  169.      * 7.堆排序 
  170.      */ 
  171.     public void heapSort(int[] arr) { 
  172.         int n = arr.length; 
  173.         for (int i = n / 2; i > 0; i--) { // 初始化建堆 
  174.             heapAdjust(arr, i - 1, n); 
  175.         } 
  176.  
  177.         for (int i = n - 2; i >= 0; i--) { // 不斷輸出堆頂元素並調整新堆 
  178.             int temp = arr[i + 1]; // 交換堆頂元素與堆底元素 
  179.             arr[i + 1] = arr[0]; 
  180.             arr[0] = temp; 
  181.             heapAdjust(arr, 0, i + 1); // 調整 
  182.         } 
  183.         /** 輸出 **/ 
  184.         for (int k = 0; k < arr.length; k++) { 
  185.             System.out.print(arr[k] + ","); 
  186.         } 
  187.         System.out.println(); 
  188.     } 
  189.  
  190.     /** 調整爲小頂堆 **/ 
  191.     private void heapAdjust(int[] arr, int low, int high) { 
  192.         int temp = arr[low]; // 頂端元素 
  193.         int j = low * 2 + 1// 左邊子元素 
  194.  
  195.         while (j <= high - 1) { // 從第一個子元素逐漸向下篩選 
  196.             if (j < high - 1 && arr[j] < arr[j + 1]) { // 找到最大的子元素 
  197.                 j++; 
  198.             } 
  199.             if (temp >= arr[j]) { // 若頂端元素temp比孩子元素都小,插入到頂端 
  200.                 break
  201.             } 
  202.             arr[(j - 1) / 2] = arr[j]; 
  203.             j = 2 * j + 1
  204.         } 
  205.         arr[(j - 1) / 2] = temp; 
  206.     } 
  207.  
  208.     /** 
  209.      * 8.歸併排序 
  210.      */ 
  211.     public void mergeSort(int[] arr, int low, int high) { 
  212.         if (low < high) { 
  213.             mergeSort(arr, low, (high + low) / 2); 
  214.             mergeSort(arr, (high + low) / 2 + 1, high); 
  215.             merge(arr, low, (low + high) / 2 + 1, high); 
  216.         } 
  217.         /** 輸出 **/ 
  218.         for (int k = 0; k < arr.length; k++) { 
  219.             System.out.print(arr[k] + ","); 
  220.         } 
  221.         System.out.println(); 
  222.     } 
  223.  
  224.     /** 歸併操作將基本單位歸併成整個有序的數組 **/ 
  225.     private void merge(int[] list, int left, int right, int last) { 
  226.         int[] temp = new int[list.length];// 臨時數組 
  227.         int j = 0
  228.         int lowIndex = left; 
  229.         int mid = right - 1
  230.         int n = last - lowIndex + 1
  231.         while (left <= mid && right <= last) { 
  232.             if (list[left] < list[right]) { 
  233.                 temp[j++] = list[left++]; 
  234.             } else { 
  235.                 temp[j++] = list[right++]; 
  236.             } 
  237.         } 
  238.         while (left <= mid) { 
  239.             temp[j++] = list[left++]; 
  240.         } 
  241.         while (right <= last) { 
  242.             temp[j++] = list[right++]; 
  243.         } 
  244.         for (j = 0; j < n; j++) { 
  245.             list[lowIndex + j] = temp[j]; 
  246.         } 
  247.     } 
  248.  
  249.     /** 
  250.      *9.計數排序                ---適用於待排序的數組元素最大值已經給定的情況下。 
  251.      *                          b[] 存放正確排序的結果 
  252.      *                          c[] 存放每個元素在序列中出現的次數 
  253.      *                          k   爲序列中的最大值 
  254.      */ 
  255.     public void countSort(int[] arr, int[] b, int k) { 
  256.         int[] c = new int[k + 1]; 
  257.         for (int i = 0; i < k; i++) { 
  258.             c[i] = 0
  259.         } 
  260.         for (int i = 0; i < arr.length; i++) { 
  261.             c[arr[i]]++;                                //存放a中元素等於i的元素個數 
  262.         } 
  263.         for (int i = 1; i <= k; i++) { 
  264.             c[i] += c[i - 1];                           //存放a中元素<=i的元素個數 
  265.         } 
  266.         for (int i = arr.length - 1; i >= 0; i--) {     //把a中每個元素放入b中正確的位置. 
  267.             b[c[arr[i]] - 1] = arr[i]; 
  268.             c[arr[i]]--;                                //a中如果有元素的值相等此句是必須的. 
  269.         } 
  270.     } 
  271.     /**返回序列中的最大值**/ 
  272.     public static int getMaxNumber(int[] a) { 
  273.         int max = 0
  274.         for (int i = 0; i < a.length; i++) { 
  275.             if (max < a[i]) { 
  276.                 max = a[i]; 
  277.             } 
  278.         } 
  279.         return max; 
  280.     } 
  281.  
  282.     /** 
  283.      * 10.基數排序          ---將所有待比較數值(正整數)統一爲同樣的數位長度,數位較短的數前面補零. 然後,從最低位開始, 依次進行一次排序. 
  284.      *                          radix 設定的基數 
  285.      *                          d     數組中最多位數 
  286.      */ 
  287.     public void radixSort(int[] arr,int radix,int d){ 
  288.          //定義一個臨時數組大小和data數組相等   
  289.         int[] temp = new int[arr.length];   
  290.         //定義一個位計數器,用來存放當前位的元素有多少個   
  291.         int[] bucket = new int[radix];   
  292.    
  293.         int rate = 1;   
  294.         for (int i = 0; i < d; i++) {   
  295.             //將data數組中的各個元素複製到temp數組中   
  296.             System.arraycopy(arr, 0, temp, 0, arr.length);   
  297.             //將bucket數組的各個元素重置0   
  298.             Arrays.fill(bucket, 0);   
  299.                
  300.             for (int j = 0; j < arr.length; j++) {   
  301.                 int index = (temp[j] / rate) % radix;   
  302.                 bucket[index] += 1;   
  303.             }   
  304.                
  305.             for (int j = 1; j < bucket.length; j++) {   
  306.                 bucket[j] = bucket[j] + bucket[j - 1];   
  307.             }   
  308.    
  309.             for (int j = arr.length - 1; j >= 0; j--) {   
  310.                  int index = (temp[j] / rate) % radix;   
  311.                  arr[--bucket[index]] = temp[j];   
  312.             }   
  313.             //接着rate乘以10並對十位進行相應排序   
  314.             rate *= radix;   
  315.         }   
  316.         /** 輸出 **/ 
  317.         for (int k = 0; k < arr.length; k++) { 
  318.             System.out.print(arr[k] + ","); 
  319.         } 
  320.     } 
  321.      
  322.     public static void main(String[] args) { 
  323.         int[] arr = { 2653481113483215 }; 
  324.         /** 待排序數組 **/ 
  325.         int low = 0
  326.         /** 排序期間的起始位 **/ 
  327.         int high = arr.length; 
  328.         /** 排序期間的末位 **/ 
  329.         int[] delta = { 531 }; 
  330.         Sort s = new Sort(); 
  331.         // s.insertSort(arr, low, high); 
  332.         // s.binInsertSort(arr, low, high); 
  333.         // s.shellSort(arr, low, high, delta); 
  334.         // s.bubbleSort(arr, low, high); 
  335.         // s.quickSort(arr, low, high-1); 
  336.         // s.selectSort(arr, low, high); 
  337.         // s.heapSort(arr); 
  338.         //s.mergeSort(arr, low, high - 1); 
  339.         //int[] b = new int[arr.length]; 
  340.         //s.countSort(arr, b, Sort.getMaxNumber(arr)); 
  341.         /** 輸出 **/ 
  342. //      for (int k = 0; k < b.length; k++) { 
  343. //          System.out.print(b[k] + ","); 
  344. //      } 
  345.         s.radixSort(arr, 102); 
  346.     } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章