欢迎来到MilkCoder的博客:
排序在各种场合经常被用到。
快速排序是十分常用的高效率的算法。
其思想是:先选一个“标尺”,
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。
这样,排序问题就被分割为两个子区间。
再分别对子区间排序就可以了。
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
下面附上代码:
#include <cstdio>
void qs(int *a,int left,int right){
if(left<right){
int low=left,high=right;
int key=a[left];//将数列最左端的值设为基准值;
while(low<high){
while(low<high&&a[high]>=key) high--;//寻找第一个比基准值小的元素;
if(low<high) a[low++]=a[high];//找到,并将该元素放在key的左端;
else break;//没找到 ,说明low>=high即已经找到key应该在的位置下标;
while(low<high&&a[low]<=key) low++;//寻找第一个比基准值大的元素;
if(low<high) a[high--]=a[low];//找到,并将该元素放在key的右端;
else break;
}//循环结束时 low与high相等;
a[low]=key;//将key放在合适的位置,此时,key左边的值都不大于它,右边的值都不小于它;
qs(a,left,low-1);
qs(a,low+1,right);
//对该函数进行递归调用,完成对key左边序列和右边序列的排序;
}
}
int main(){
int a[]={9,8,7,6,5,4,3,2,1,0};
qs(a,0,9);
for(int i=0;i<10;i++) printf("%d ",a[i]);
return 0;
}
再附上指针版本的代码:
#include <cstdio>
void quicksort(int *left,int *right){
if(left<right){
int *low=left,*high=right,key=*left;
while(low<high){
while(low<high&&*high>=key) high--;
if(low<high){
*low=*high;
low++;
}
else break;
while(low<high&&*low<=key) low++;
if(low<high){
*high=*low;
high--;
}
else break;
}
*low=key;
quicksort(left,low-1);
quicksort(low+1,right);
}
}
int main(){
int a[]={2,4,9,3,6,7,1,5};
quicksort(a,a+7);
for(int i=0;i<8;i++) printf("%d ",a[i]);
return 0;
}
“`