雙邊循環法
#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;
}