快速排序是目前平均性能最好的排序方式,被作为数组排序首选。
基本思想:将一个数组分为左右两部分以q为界,左部分小于q,右部分大于q;接下来分治策略,将左右两部分继续按照这个规则划分,直至不能划分,该数组便排序完毕。
关键:如何划分左右部分?q该取哪个值?(恕我愚钝,算法导论上的做法没看懂,于是逼着自己想了一个解法)
分析:既然这个数组未排序(顺序随机),不如就让该数组第一个值为q,比q小的置于左边,比q大的置于右边,但是其中又需要一个技巧,若从前到后依次与q比较,若比q小则需将数组整个向后挪一位以插入这个较小值,若比q大又需将数组向前挪动。
那么不如设置一个变量temp存p的值,先将第一个位置空出来,先从后向前寻找比q小的数值填上第一个位置,此时这个位置又将空出来(这个位置本该用来放比q大的值),那么再从前向后寻找比q大的数值填上这个位置(此时空出来的位置本该用来放比q小的值),如此循环直到从前向后与从后向前重合,此时这个位置便是p所在位置(左边比q小,右边比q大)
int devide(int *a,int low,int high){ int temp = a[low]; while(low<high){ while(temp<a[high]&&high>low){ high--; } // a[low] = a[high]; // low++; if(high>low){ a[low] = a[high]; low++; } while(temp>a[low]&&high>low){ low++; } // a[high] = a[low]; // high--; if(high>low){ a[high] = a[low]; high--; } } a[low] = temp; return low; }
分治:
void quick_sort(int *a,int low,int high){ if(low<high){ int q = devide(a,low,high); quick_sort(a,low,q-1); quick_sort(a,q+1,high); } }
测试代码:
#include<iostream> using namespace std; int devide(int *a,int low,int high){ int temp = a[low]; while(low<high){ while(temp<a[high]&&high>low){ high--; } // a[low] = a[high]; // low++; if(high>low){ a[low] = a[high]; low++; } while(temp>a[low]&&high>low){ low++; } // a[high] = a[low]; // high--; if(high>low){ a[high] = a[low]; high--; } } a[low] = temp; return low; } void quick_sort(int *a,int low,int high){ if(low<high){ int q = devide(a,low,high); quick_sort(a,low,q-1); quick_sort(a,q+1,high); } } int main(){ int a[15]; for(int i=0;i<10;i++){ cin>>a[i]; } quick_sort(a,0,9); for(int i=0;i<10;i++){ cout<<a[i]<<" "; } return 0; }