实现原理:
- 快速排序:关键点是从队列中任意取出一个值,将其放在正确的位置(左边小于等于此数,右边大于等于此数),确定每个数自己的位置以后队列便是从小大大依次排序。
- 归并排序:先将队列拆封成两更小的队列,小队列依次排序,让后再将小队列合并,并确保顺序。
代码:
1 public class test {
2 public static void main(String args[]) {
3 int[] aa = { 4, 5, 2, 7, 8, 2, 1, 6, 4, 4, 3 };
4 //quicksort(aa, 0, aa.length - 1);
5 mergesort(aa, 0, aa.length - 1);
6 for (int i : aa) {
7 System.out.print(i + " ");
8 }
9 }
10
11 /**
12 * 快速排序
13 *
14 * @param aa
15 * @param begin
16 * @param end
17 */
18 public static void quicksort(int[] aa, int begin, int end) {
19 if (begin < end) {
20 int b = begin;
21 int e = end;
22 int base = aa[begin];
23 while (b < e) {
24 while (b < e && aa[e] >= base)
25 e--;
26 aa[b] = aa[e];
27 while (b < e && aa[b] <= base)
28 b++;
29 aa[e] = aa[b];
30 };
31 //b与e相等,任意取一个
32 aa[b] = base;
33 quicksort(aa, begin, b - 1);
34 quicksort(aa, b + 1, end);
35 }
36 }
37
38 /**
39 * 归并排序
40 *
41 * @param aa
42 * @param begin
43 * @param end
44 */
45 public static void mergesort(int[] aa, int begin, int end) {
46 if (begin < end) {
47 int middle = (begin + end) / 2;
48 mergesort(aa, begin, middle);
49 mergesort(aa, middle + 1, end);
50 int[] tmpArr = new int[aa.length];
51 int mid = middle + 1; // 右边的起始位置
52 int tmp = begin;
53 int third = begin;
54 while (begin <= middle && mid <= end) {
55 // 从两个数组中选取较小的数放入中间数组
56 if (aa[begin] <= aa[mid]) {
57 tmpArr[third++] = aa[begin++];
58 } else {
59 tmpArr[third++] = aa[mid++];
60 }
61 }
62 // 将剩余的部分放入中间数组
63 while (begin <= middle) {
64 tmpArr[third++] = aa[begin++];
65 }
66 while (mid <= end) {
67 tmpArr[third++] = aa[mid++];
68 }
69 // 将中间数组复制回原数组
70 while (tmp <= end) {
71 aa[tmp] = tmpArr[tmp++];
72 }
73 }
74 }
75 }