快速排序有很多实现方法,主要的有两种,总结一下:
第一种:
设置左右两个指针,low,high,设置枢纽记录当前比较对象temp,然后首先从高位置high向前搜索找到第一个比temp小的数,然后放到low位置,再找再从low位置开始向后找比temp大的数,再放到high位置,直到low==high。最后把temp放到low位子上。一遍快排完成。这样结束后数组low的左边的数都比low小于或等于,右边的数大于或等于。然后再递归快排左右两个子区间。
int solve(int* a,int low,int high)
{
int temp=a[low];
while(low<high){
while(low<high&&a[high]>=temp)high--;
a[low]=a[high];
while(low<high&&a[low]<=temp)low++;
a[high]=a[low];
}
a[low]=temp;
return low;
}
int QuickSort(int* a,int low,int high)
{
if(low<high){
int mid=solve(a,low,high);
QuickSort(a,low,mid-1);
QuickSort(a,mid+1,high);
}
}
第二种:
同样把最左边一个设置一个枢轴(就是比较对象),然后设置两个指针,temp,i,这两个指针不会像上面那样,一个向前扫,一个向后扫,而是都是向后扫描,其中i逐步向后移动,把当前的数和枢轴比较(就是a[low]),如果比他大或者相等,继续移动,否则,跟temp位置的数交换,然后temp和i都++,可以看出,从temp往前的数都是比a[low],小的,往后的数都是比a[low],大的,这样扫描完一次后,也可以分成左右两个子区间,在递归快排就好了。
int Partition(int *a,int low,int high)
{
if(low<=high){
int temp=low;
for(int i=low+1;i<=high;i++){
if(a[i]<=a[low]){
swap(a[temp+1],a[i]);
++temp;
}
}
swap(a[low],a[temp]);
return temp;
}
}
int QuickSort(int* a,int low,int high)
{
if(low<high){
int mid=Partition(a,low,high);
QuickSort(a,low,mid-1);
QuickSort(a,mid+1,high);
}
}