分治法應用實例二:快速排序

1、基本介紹:
實際中最常用的排序算法,期望時間複雜度O(nlgn),且常係數很小
在這裏插入圖片描述
分治理念步驟:
在這裏插入圖片描述
2、C++代碼及步驟:
思路:
1、選主元;
2、小於主元放左邊,大於主元放右邊,主元放中間,遞歸調用,直到左邊指針>=右邊指針。
注:當待排元素少時,效果不如插入排序,因此下面代碼在元素少於100用了插入排序。

void QuickSort(int* A,int N) //算法接口
{
	QuickSortReal(A,0,N-1); //主函數入口
}

void QuickSortReal(int* A,int left, int right)
{
	if(100<=right-left){ //若待排數組大則用快排,小則用插入排序
		int pivot = Medion3(A, left, right) //選主元,可以直接用數組最後一個值作爲主元
		int i = left; //此位置目前小於主元
		int j = right-1; //此位置目前是主元
		for(;;){
			while(A[++i]<pivot){} //左邊大於主元的於
			while(A[--j]>pivot){} //右邊小於主元的交換
			if(i<j) swap(A[i],A[j]);
			else break;
		}
		swap(A[i],A[right-1]); //將主元放在中間位置,i爲主元所在下標
		QuickSortReal(A,left,i-1);
		QuickSortReal(A,i+1,right);
	}
	else{ // 插入排序
		InsertionSort(A,left,Right-left+1);
	}
}

int Medion3(int* A,int left, int right) //用於選主元,此部分可以不要,
										//直接用數組最後一個元素左主元
{
	int center = (left+right)/2;
	if(A[left]>A[center]) swap(A[left],A[center];)
	if(A[left]>A[right]) swap(A[left],A[right];)
	if(A[center]>A[right]) swap(A[center],A[right];)
	swap(A[center],A[right-1]); //將主元放數組右邊倒數第二位
	return A[right-1];
}

參考資料: 算法導論7.1節:快速排序的描述

總結:

1、快速排序爲最常用的算法。
2、通常將數組中最後一個元素作爲主元。

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