排序 - 快速排序 细节分析

快速排序的原理都已经很清楚了,现在讲讲代码的细节问题和处理方法

 1 #include<iostream>
 2 using namespace std;
 3 void quicksort(int* a, int low, int high)
 4 {
 5     if (low < high)
 6     {
 7         int begin = low;
 8         int end = high;
 9         int key = a[begin];
10         while (begin < end)
11         {
12             while (begin<end && a[end]>key)
13                 end--;
14             if (begin < end)
15                 a[begin++] = a[end];
16             while (begin < end && a[begin] < key)
17                 begin++;
18             if (begin < end)
19                 a[end--] = a[begin];
20         }
21         a[begin] = key;
22         quicksort(a, low, begin - 1);
23         quicksort(a, begin + 1, high);
24     }
25 
26 }
27 int main()
28 {
29     int b[6] = {3,4,6,1,2,5};
30     quicksort(b, 0, 5);
31     for (int i = 0;i < 6;i++)
32         cout << b[i] << endl;
33     return 0;
34 }

(这个是最基础的版本,如果有问题请提醒)

代码中,我设置low和high为数组的开头和结尾,注意数组的越界问题,数组里面10个数字,那么high应该是9!

然后开头的这个if,这个给机器很清楚的指令,我们再看也会很明白原理,所以这个if还是很好的。

下面的是2个while     if     ,这两个语句就是用来判断和交换的,第一个语句是指针(end)从后面往前走,第二个是(begin)从前往后走,找到了对应的元素就交换位置。

这个中间一个细节问题,比如第15行,a[begin++]=a[end]  这个语句很关键,使指针自动指向下一个(如果是begin,就指向后一个,如果是end,就指向前一个),理解了以后看起来也很明白,如果没有类似功能的语句,程序应该会在某些条件下进入死循环。(比如,当begin=3,end=4,a[begin]=1,a[end]=1,这种条件下,所有条件都满足,但是他会无脑前一个赋值给后一个,后一个给前一个)。

最后就是递归的参数,应该是第一个参数是数组,这个不用多讲,第二个参数是要处理的数组的开头部分,第三个参数是要处理的数组的结尾部分

(比如,第一次递归调用时,low=0,begin-1=2,因为一共6个数字,并且a[2]也就是第三个数字是基准数字,基准数字不用参与再一轮的排序,所以这个例子当中应该是排序第0,1个元素)

 

最后给自己加油!

posted @ 2019-10-20 16:04  沉梦昂志_doc  阅读(339)  评论(0编辑  收藏  举报