快速排序(Quick Sort)C語言

背景

已知數組 src 如下:

[5, 3, 7, 6, 4, 1, 0, 2, 9, 10, 8]

快速排序1

在數組 src[low, high] 中,取 src[low] 作爲 關鍵字(key)
通過 一趟快速排序 找到 key 的位置 keypos 。
keypos 將數組劃分爲兩部分: src[low, keypos - 1]src[keypos + 1, high]
src[low, keypos - 1] 中的元素都 不大於 key
src[keypos + 1, high] 中的元素都 不小於 key

一趟快速排序 步驟如下:
1、定義兩個指針 leftright , 初值爲 lowhigh
2、定義關鍵字 key , 初值爲 src[low]
3、 right 向前搜索,找到第 1 個 小於 key 的元素時,將 src[left]src[right] 互換。
4、 left 向後搜索,找到第 1 個 大於 key 的元素時,將 src[left]src[right] 互換。
5、 重複 3,4,直到 left = right 時結束。


快速排序2

通過上面的步驟可以發現,我們互換的數據有 1 個數關鍵字,但是關鍵字我們已經記錄在 key 中,所以不需要將關鍵字不停的互換。只需要將另一個值移動即可。


快速排序2(C代碼)

/*********************************************************************
Function: 快速排序2
Description:將數組src[low,high]升序排序
Parameters: src:  待排序數組
			low:  起始下標
			high: 結束下標
Return Value: 排序完成返回0,否則-1
Author: wowpH
Date: 2019-11-12 21:57:42
Reference: 數據結構(C語言版)嚴蔚敏 吳偉民 清華大學出版社
*********************************************************************/
int quick_sort_two(int src[], int low, int high) {
	if (low < 0 || low >= high) {
		return -1;// 下標不合法
	}
	int key = src[low];// 將第1個作爲關鍵字
	int left = low;// 左邊界
	int right = high;// 右邊界
	while (left < right) {// 兩端交替向中間掃描
		// 在右邊查找比關鍵字小的數據
		while (left < right && src[right] >= key) {
			--right;
		}
		src[left] = src[right];// 將比關鍵字小的移動到左邊
		// 在左邊查找比關鍵字大的數據
		while (left < right && src[left] <= key) {
			++left;
		}
		src[right] = src[left];// 將比關鍵字大的移動到右邊
	}
	src[left] = key;// 此時left就是一趟快速排序後的關鍵字所在的位置
	quick_sort_two(src, low, left - 1);// 對左邊的數據遞歸排序
	quick_sort_two(src, left + 1, high);// 對右邊的數據遞歸排序
	return 0;
}

快速排序視頻


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