Sort Array

各种 Sort 算法,包括 Quick Sort, Merge Sort, Heap Sort, Count Sort

  1 package Sort;
  2 
  3 public class Sort {
  4     /* 
  5      * Quick Sort 
  6      * Time : O(n log n)
  7      * Space : O(log n) -- stack frame
  8      */
  9     private void quickSort(int[] arr) {
 10         if (arr == null || arr.length < 2) 
 11             return;
 12         helperQuick(arr, 0, arr.length-1);
 13         return;
 14     }
 15     private void helperQuick(int[] arr, int left, int right) {
 16         if (left >= right) 
 17             return;
 18         int i = left, j = right;
 19         int tmp = arr[i];
 20         while (i < j) {
 21             while (i<j && arr[j] >= tmp) {
 22                 j--;
 23             }
 24             arr[i] = arr[j];
 25             while (i<j && arr[i] < tmp) {
 26                 i++;
 27             }
 28             arr[j] = arr[i];
 29         }
 30         arr[i] = tmp;
 31         helperQuick(arr, left, i-1);
 32         helperQuick(arr, i+1, right);
 33     }
 34     /*--------------------------------------*/
 35     
 36     /*
 37      * Merge Sort
 38      * Time : O(n log n)
 39      * Space : O(n)
 40      */
 41     private void mergeSort(int[] arr) {
 42         if (arr == null || arr.length < 2)
 43             return;
 44         helperMerge(arr, 0, arr.length-1);
 45     }
 46     private void helperMerge(int[] arr, int s, int t) {
 47         if (s >= t) return;
 48         int mid = s + (t - s) / 2;
 49         helperMerge(arr, s, mid);
 50         helperMerge(arr, mid+1, t);
 51         merge(arr, s, mid, mid+1, t);
 52     }
 53     private void merge(int[] arr, int s1, int t1, int s2, int t2) {
 54         int[] tmp = new int[t1 - s1 + t2 - s2 + 2];
 55         int i = s1, j = s2, run = 0;
 56         while (i <= t1 && j <= t2) {
 57             if (arr[i] < arr[j]) {
 58                 tmp[run++] = arr[i++];
 59             } else {
 60                 tmp[run++] = arr[j++];
 61             }
 62         }
 63         while (i <= t1) {
 64             tmp[run++] = arr[i++];
 65         }
 66         while (j <= t2) {
 67             tmp[run++] = arr[j++];
 68         }
 69         System.arraycopy(tmp, 0, arr, s1, tmp.length);
 70     }
 71     /*--------------------------------------*/
 72     
 73     /*
 74      * Heap sort
 75      * Time : O(n log n)
 76      * Space : O(1)
 77      */
 78     private void heapSort(int[] arr) {
 79         for (int i = arr.length / 2; i >= 0; i--) {
 80             siftDown(arr, i, arr.length);
 81         }
 82         for (int i = arr.length-1; i > 0; i--) {
 83             swap(arr, 0, i);
 84             siftDown(arr, 0, i);
 85         }
 86     }
 87     private void siftDown(int[] arr, int parent, int length) {
 88         int child = parent * 2 + 1;
 89         while (child < length) {
 90             if (child + 1 < length && arr[child] < arr[child + 1])
 91                 child++;
 92             if (arr[parent] < arr[child]) {
 93                 swap(arr, parent, child);
 94                 parent = child;
 95                 child = parent * 2;
 96             } else break;
 97         }
 98     }
 99     private void swap(int[] arr, int i, int j) {
100         int tmp = arr[i];
101         arr[i] = arr[j];
102         arr[j] = tmp;
103     }
104     /*--------------------------------------*/
105     
106     /*
107      * Count Sort
108      * - Given a certain Range
109      * - all keys in the array are between that range
110      * Time : O(n + k)
111      * Space : O(n + k)
112      */
113     public void countSort(int[] arr) {
114         int[] range = new int[15];
115         
116         for (int i : arr) {
117             range[i]++;
118         }
119         int j = 0;
120         for (int i = 0; i < arr.length; i++) {
121             while (range[j] == 0) {
122                 j++;
123             }
124             arr[i] = j;
125             range[j]--;
126         }
127     }
128     /*--------------------------------------*/
129     
130     public static void main(String[] args) {
131         Sort sort = new Sort();
132         
133         System.out.println("Quick Sort");
134         int[] arr0 = {6, 9, 10, 7, 8, 5, 3, 4, 11, 2};
135         sort.quickSort(arr0);
136         for (int i : arr0)
137             System.out.print(i+" ");
138         System.out.println();
139         System.out.println();
140         
141         System.out.println("Merge Sort");
142         int[] arr1 = {6, 9, 10, 7, 8, 5, 3, 4, 11, 2};
143         sort.mergeSort(arr1);
144         for (int i : arr1)
145             System.out.print(i+" ");
146         System.out.println();
147         System.out.println();
148         
149         System.out.println("Heap Sort");
150         int[] arr2 = {6, 9, 10, 7, 8, 5, 3, 4, 11, 2};
151         sort.heapSort(arr2);
152         for (int i : arr2)
153             System.out.print(i+" ");
154         System.out.println();
155         System.out.println();
156         
157         System.out.println("Count Sort <range: 0 - 14>");
158         int[] arr3 = {6, 9, 10, 7, 8, 5, 3, 4, 11, 2};
159         sort.heapSort(arr3);
160         for (int i : arr3)
161             System.out.print(i+" ");
162         System.out.println();
163     }
164 }
原文地址:https://www.cnblogs.com/joycelee/p/4516145.html