[Java]各种经典排序

来源:互联网 发布:淘宝七匹狼钱包 编辑:程序博客网 时间:2024/05/22 03:45
  1. package sort;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class SortMethods {  
  7.     public static void main(String args[]) {  
  8.         int a[] = { 5814312376 };  
  9.         int size = a.length;  
  10.   
  11.         // BubbleSort(a, size);  
  12.         // InsertSort(a, size);  
  13.         SelectSort(a, size);  
  14.         // QuickSort(a, size);  
  15.         // HeapSort(a, size);  
  16.         // ShellSort(a, size);  
  17.         // MergeSort(a, size);  
  18.         // CountSort(a, size);  
  19.         print(a, size);  
  20.     }  
  21.   
  22.     public static void print(int[] a, int size) {  
  23.         for (int i = 0; i < size; i++) {  
  24.             System.out.print(a[i] + " ");  
  25.         }  
  26.     }  
  27.   
  28.     // 冒泡排序  
  29.     public static void BubbleSort(int[] a, int size) {  
  30.         for (int i = 0; i < size; i++) {  
  31.             for (int j = size - 1; j > i; j--) {  
  32.                 if (a[j] < a[j - 1]) {  
  33.                     Swap(a, j - 1, j);  
  34.                 }  
  35.             }  
  36.         }  
  37.     }  
  38.   
  39.     // 选择排序  
  40.     public static void SelectSort(int[] a, int size) {  
  41.         int min; // min指向最小数的下标  
  42.         for (int i = 0; i < size; i++) {  
  43.             min = i;  
  44.             for (int j = i + 1; j < size; j++) {  
  45.                 if (a[min] > a[j]) {  
  46.                     min = j;  
  47.                 }  
  48.             }  
  49.             if (min != i)  
  50.                 Swap(a, i, min);  
  51.         }  
  52.     }  
  53.   
  54.     // 插入排序  
  55.     public static void InsertSort(int[] a, int size) {  
  56.         int temp, j;  
  57.         for (int i = 1; i < size; i++) {  
  58.             temp = a[i];  
  59.             j = i - 1;  
  60.             while (j >= 0 && temp < a[j]) {  
  61.                 a[j + 1] = a[j];  
  62.                 j--;  
  63.             }  
  64.             a[j + 1] = temp;  
  65.         }  
  66.     }  
  67.   
  68.     // 快速排序  
  69.     public static void QuickSort(int[] a, int size) {  
  70.         RecQuickSort(a, 0, size - 1);  
  71.     }  
  72.   
  73.     public static void RecQuickSort(int[] a, int low, int high) {  
  74.         int p;  
  75.         if (low < high) {  
  76.             p = Partition(a, low, high);  
  77.             RecQuickSort(a, low, p - 1);  
  78.             RecQuickSort(a, p + 1, high);  
  79.         }  
  80.     }  
  81.   
  82.     public static int Partition(int[] a, int low, int high) {  
  83.         int p = a[low];  
  84.         while (low < high) {  
  85.             while (low < high && a[high] >= p) {  
  86.                 high--;  
  87.             }  
  88.             a[low] = a[high];  
  89.             while (low < high && a[low] <= p) {  
  90.                 low++;  
  91.             }  
  92.             a[high] = a[low];  
  93.         }  
  94.         a[low] = p;  
  95.         return low;  
  96.     }  
  97.   
  98.     // 堆排序  
  99.     public static void HeapSort(int[] a, int size) {  
  100.         BuildHeap(a, size);  
  101.         for (int i = size - 1; i >= 0; i--) {  
  102.             Swap(a, 0, i);  
  103.             HeapAdjust(a, 0, i);  
  104.         }  
  105.     }  
  106.   
  107.     public static void BuildHeap(int[] a, int size) {  
  108.         for (int i = size / 2 - 1; i >= 0; i--) {  
  109.             HeapAdjust(a, i, size);  
  110.         }  
  111.     }  
  112.   
  113.     public static void HeapAdjust(int[] a, int i, int size) {  
  114.         int temp = a[i];  
  115.         int j = 2 * i + 1;  
  116.         while (j < size) {  
  117.             if (j + 1 < size && a[j + 1] > a[j])  
  118.                 j++;  
  119.   
  120.             if (a[j] < temp)  
  121.                 break;  
  122.   
  123.             a[i] = a[j];  
  124.             i = j;  
  125.             j = 2 * i + 1;  
  126.         }  
  127.         a[i] = temp;  
  128.     }  
  129.   
  130.     // 希尔排序  
  131.     public static void ShellSort(int[] a, int size) {  
  132.         int temp, k;  
  133.         for (int i = size / 2; i > 0; i /= 2) {  
  134.             for (int j = i; j < size; j = j + i) {  
  135.                 temp = a[j];  
  136.                 k = j;  
  137.                 while (k - i >= 0 && temp < a[k - i]) {  
  138.                     a[k] = a[k - i];  
  139.                     k = k - i;  
  140.                 }  
  141.                 a[k] = temp;  
  142.             }  
  143.         }  
  144.     }  
  145.   
  146.     // 归并排序  
  147.     public static void MergeSort(int[] a, int size) {  
  148.         RecMerge(a, 0, size - 1);  
  149.     }  
  150.   
  151.     public static void RecMerge(int[] a, int low, int high) {  
  152.         if (low < high) {  
  153.             int middle = (low + high) / 2;  
  154.             RecMerge(a, low, middle);  
  155.             RecMerge(a, middle + 1, high);  
  156.             Merge(a, low, middle, high);  
  157.         }  
  158.     }  
  159.   
  160.     public static void Merge(int[] a, int low, int middle, int high) {  
  161.         int temp1[] = { 00000000000 };  
  162.         int temp2[] = { 00000000000 };  
  163.         int n1 = middle - low + 1;  
  164.         int n2 = high - middle;  
  165.   
  166.         for (int i = 0; i < n1; i++) {  
  167.             temp1[i] = a[low + i];  
  168.         }  
  169.         for (int i = 0; i < n2; i++) {  
  170.             temp2[i] = a[middle + i + 1];  
  171.         }  
  172.         temp1[n1] = 100;  
  173.         temp2[n2] = 100;  
  174.         int j = 0, k = 0;  
  175.         for (int i = low; i <= high; i++) {  
  176.             if (temp1[j] < temp2[k]) {  
  177.                 a[i] = temp1[j];  
  178.                 j++;  
  179.             } else {  
  180.                 a[i] = temp2[k];  
  181.                 k++;  
  182.             }  
  183.         }  
  184.     }  
  185.   
  186.     // 计数排序  
  187.     public static void CountSort(int a[], int size) {  
  188.         int MAX = 0;  
  189.         for (int i = 0; i < size; i++) {  
  190.             if (a[i] > MAX)  
  191.                 MAX = a[i];  
  192.         }  
  193.         MAX++;  
  194.         List<Integer> temp = new ArrayList<Integer>();  
  195.         for (int i = 0; i < MAX; i++) {  
  196.             temp.add(i, 0);  
  197.         }  
  198.   
  199.         for (int i = 0; i < size; i++) {  
  200.             temp.set(a[i], (Integer) (temp.get(a[i])) + 1);  
  201.         }  
  202.   
  203.         int j, k = 0;  
  204.         for (int i = 0; i < MAX; i++) {  
  205.             j = temp.get(i);  
  206.             while (j != 0) {  
  207.                 a[k] = i;  
  208.                 k++;  
  209.                 j--;  
  210.             }  
  211.         }  
  212.     }  
  213.   
  214.     public static void Swap(int a[], int i, int j) {  
  215.         int temp;  
  216.         temp = a[j];  
  217.         a[j] = a[i];  
  218.         a[i] = temp;  
  219.     }  
  220. }  
0 0
原创粉丝点击