快速排序
严书上的快排是以最左边元素为枢纽的,如下:
#include <iostream> #include<algorithm> using namespace std; int Partition(int a[],int left,int right){ int p=a[left]; //传统快排 while(left<right){ while(a[right]>p&&left<right)right--; a[left]=a[right]; while(a[left]<p&&left<right)left++; a[right]=a[left]; } a[left]=p; return left; } void quicksort(int a[],int left,int right){ //快速排序 if(left<right){ int p=Partition(a,left,right); quicksort(a,left,p-1); quicksort(a,p+1,right); } } int main(){ int a[6]={5,7,6,8,3,1}; quicksort(a,0,5); for(int i=0;i<6;i++) cout<<a[i]<<" "; cout<<endl; return 0; }
注意在Partition函数里面利用了两个标杆左右同时遍历,方法巧妙
2.随机快速排序
实际上,如果原始序列本身就接近于有序,利用上面的快排效率和变低,因为枢纽没有把序列划分为两个长度接近的子区间,这时可以采用随机枢纽,只需要再上面的Partition函数前面生成一个区间范围内的随机数即可,这要用到srand(),和rand()和time()几个函数,注意头文件的添加,得随机快速排序如下。
#include <iostream> #include<algorithm> #include<time.h> using namespace std; int Partition(int a[],int left,int right){ int r=rand()%(right-left+1)+left; swap(a[r],a[left]); //随机快排 int p=a[left]; //传统快排 while(left<right){ while(a[right]>p&&left<right)right--; a[left]=a[right]; while(a[left]<p&&left<right)left++; a[right]=a[left]; } a[left]=p; return left; } void quicksort(int a[],int left,int right){ //快速排序 if(left<right){ int p=Partition(a,left,right); quicksort(a,left,p-1); quicksort(a,p+1,right); } } int main(){ srand((unsigned) time(NULL)); int a[6]={5,7,6,8,3,1}; quicksort(a,0,5); for(int i=0;i<6;i++) cout<<a[i]<<" "; cout<<endl; return 0; }