快速排序与归并排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序与归并排序相关的知识,希望对你有一定的参考价值。

实现原理:

  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 }

 

以上是关于快速排序与归并排序的主要内容,如果未能解决你的问题,请参考以下文章

重学数据结构和算法之归并排序快速排序

快速排序与归并排序

算法浅谈——分治算法与归并快速排序(附代码和动图演示)

JavaScript 数据结构与算法之美 - 归并排序快速排序希尔排序堆排序

精益求精单链表归并排序与快速排序

常用排序快速排序与归并排序