數據結構(C語言版) 快速排序

快速排序:

快速排序(Quick Sort)是對起泡排序的一種改進。它的基本思想是,通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
起泡排序可參考:https://blog.csdn.net/ZipayYu/article/details/99241009

代碼實現:

說明:本博客的代碼實現貼近數據結構(C語言版) 課本代碼風格,使用抽象數據類型。

項目結構

在這裏插入圖片描述
以下文件代碼與直接插入排序時所用相同,爲避免大量代碼重複此處不再附上。
詳情可參考直接插入排序:https://blog.csdn.net/ZipayYu/article/details/98245056
status.h
ststus.cpp
SequenceListType.h
SequenceListType.cpp

快速排序的實現方式一

本部分是按照課本所示代碼實現。

/************************************
* 函數名稱: Partition
* 函數說明: 交換順序表L中的子表L.r[low]~L.r[high]的記錄,
* 函數說明: 樞軸記錄到位,並返回其所在的位置,
* 函數說明: 此時在他之前(後)的記錄均不大(小)於它。
* 編寫人員: Zipay Yu
* 編寫日期: 2019/08/11
* 返回類型: int
* 函數參數: SqList & L
* 函數參數: int low
* 函數參數: int high
*************************************/
int Partition(SqList &L, int low, int high) {
	L.r[0] = L.r[low];									//用子表的第一個記錄作樞軸記錄
	int pivotkey = L.r[low].key;						//樞軸記錄關鍵字
	while (low < high) {								//從表的兩端交替的向中間掃描
		while (low < high&&L.r[high].key >= pivotkey)	//在高端尋找比樞軸記錄小的記錄
		{ 
			--high; 
		}
		L.r[low] = L.r[high];							//將比樞軸記錄小的記錄移到低端
		while (low < high&&L.r[low].key <= pivotkey)	//在低端尋找比樞軸記錄大的記錄
		{ 
			++low; 
		}
		L.r[high] = L.r[low];							//將比樞軸記錄大的記錄移到高端
	}
	L.r[low] = L.r[0];									//樞軸記錄到位
	return low;
}
/************************************
* 函數名稱: QSort
* 函數說明: 對順序表L中的子序列L.r[low]~L.r[high]作快速排序
* 編寫人員: Zipay Yu
* 編寫日期: 2019/08/11
* 返回類型: void
* 函數參數: SqList & L
* 函數參數: int low
* 函數參數: int high
*************************************/
void QSort(SqList &L, int low, int high) {
	if (low < high) {							//長度大於1
		int pivotkey = Partition(L, low, high); //將L.r[low]~L.r[high]一分爲二
		QSort(L, low, pivotkey - 1);			//對低子表遞歸排序,pivotkey是樞軸位置
		QSort(L, pivotkey + 1, high);			//對高子表遞歸排序,pivotkey是樞軸位置
	}
}
/************************************
* 函數名稱: QuickSort
* 函數說明: 對順序表L作快速排序
* 編寫人員: Zipay Yu
* 編寫日期: 2019/08/11
* 返回類型: void
* 函數參數: SqList & L
*************************************/
void QuickSort(SqList &L) {
	QSort(L, 1, L.length);
}

data.txt

第一個數表示順序表數據個數,後面的數據爲實際的待排序數據

8 49 38 65 97 76 13 27 49

測試

int main() {
	int delta[] = { 5, 3, 2, 1 };
	SqList L;
	printf("排序前數據:");
	CreateSortList(L);			//初始化數據
	Print(L);					//輸出初始數據
	QuickSort(L);		//執行排序
	printf("排序後數據:");
	Print(L);					//輸出排序後數據
	system("pause");
	return 0;
}

在這裏插入圖片描述

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