排序 - 快速排序 细节分析
快速排序的原理都已经很清楚了,现在讲讲代码的细节问题和处理方法
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个元素)
最后给自己加油!