快速排序与归并排序

实现原理:

  1. 快速排序:关键点是从队列中任意取出一个值,将其放在正确的位置(左边小于等于此数,右边大于等于此数),确定每个数自己的位置以后队列便是从小大大依次排序。
  2. 归并排序:先将队列拆封成两更小的队列,小队列依次排序,让后再将小队列合并,并确保顺序。

代码:

 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 }

 

posted @ 2016-10-12 22:38  夜晚风吻尽  阅读(131)  评论(0编辑  收藏  举报