双边循环法
#include<iostream>
using namespace std;
int partition(int array[],int startIndex,int endIndex);
void quickSort(int array[],int startIndex,int endIndex){
//递归终止条件,startIndex>=endIndex
if(startIndex>=endIndex)
return;
//得到基准元素的位置
int pivotIndex=partition(array,startIndex,endIndex);
//根据基准元素,分成两部分进行递归排序
quickSort(array,startIndex,pivotIndex-1);
quickSort(array,pivotIndex+1,endIndex);
}
//分治(双边循环法)
int partition(int array[],int startIndex,int endIndex){
//取第1个位置的元素作为基准元素
int pivot=array[startIndex];
int left=startIndex;
int right=endIndex;
while(left!=right){
//控制right指针比较并左移
while(left<right&&array[right]>pivot){
right--;
}
//控制left指针比较并右移
while(left<right&&array[left]<=pivot){
left++;
}
//交换left和right指针所指向的元素
if(left<right){
int temp=array[left];
array[left]=array[right];
array[right]=temp;
}
}
//pivot和指针重合点交换
array[startIndex]=array[left];
array[left]=pivot;
return left;
}
int main()
{
int array[]={4,7,6,5,3,2,8,1};
int length=sizeof(array)/sizeof(array[0]);
quickSort(array,0,length-1);
for(int i=0;i<length;i++)
cout<<array[i]<<" ";
return 0;
}
单边循环法
#include<iostream>
using namespace std;
int partition(int array[],int startIndex,int endIndex);
void quickSort(int array[],int startIndex,int endIndex){
//递归终止条件,startIndex>=endIndex
if(startIndex>=endIndex)
return;
//得到基准元素的位置
int pivotIndex=partition(array,startIndex,endIndex);
//根据基准元素,分成两部分进行递归排序
quickSort(array,startIndex,pivotIndex-1);
quickSort(array,pivotIndex+1,endIndex);
}
//单边循环法和双边循环法的不同体现在partition函数内部。
//单边循环法在开始时和双边循环法类似,都是首先选定基准元素pivot。同时
//设置一个mark指针指向数列其实位置,这个mark指针代表小于基准元素的区域边界
//接下来,从基准元素的下一个位置开始遍历数组:若遍历到的元素大于基准元素,就继续往后遍历,
//若遍历到的元素小于基准元素,则需要做两件事:第一。mark指针右移1位,因为小于pivot的
//区域边界增大了1;第二,让最新遍历到的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素
//归属于小于pivot的区域。partition函数实现如下:
//分治(单边循环法)
int partition(int array[],int startIndex,int endIndex){
//取第1个位置的元素作为基准元素
int pivot=array[startIndex];
int mark=startIndex;
for(int i=startIndex+1;i<=endIndex;i++){
if(array[i]<pivot){
mark++;
int temp=array[mark];
array[mark]=array[i];
array[i]=temp;
}
}
array[startIndex]=array[mark];
array[mark]=pivot;
return mark;
}
int main()
{
int array[]={4,7,6,5,3,2,8,1};
int length=sizeof(array)/sizeof(array[0]);
quickSort(array,0,length-1);
for(int i=0;i<length;i++)
cout<<array[i]<<" ";
return 0;
}