快速排序的兩種思路(C++實現)

雙邊循環法

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章