快速排序(Quick Sort)C語言版

快速排序算法是最早由圖靈獎獲得者Tony Hoare設計出來的,他在形式化方法理論的發明中都有卓越的貢獻,是上世紀最偉大的計算機科學家之一。而這個快速排序算法只是他衆多貢獻中的一個小發明而已。更值得一提的是,我們現在學習的這個快速排序算法,被列爲20世紀十大算法之一。

快速排序其實就是我們前面認爲最慢的冒泡排序的升級,它們都屬於交換類排序。即它是通過不斷比較和移動交換來實現
排序的,只不過它的實現,增大了記錄的比較和移動的距離,將關鍵字較大的記錄從前面直接移動到後面,關鍵字較小的從後面移動到前面
,從而減少了總的比較次數和移動交換次數。

其基本思想是:
1.選擇一個基準值,我們設最右邊的一個作爲基準值;
2.遍歷整個區間,把所有的數與基準值作比較並進行數據移動,使得:
1).比基準值小的數放在基準值的左邊;
2).比基準值大的數放在基準值的右邊;
3.分治算法:[left, right] —> [left, div-1] ∪ [div+1, right],並利用遞歸的思路,遞歸的終止條件爲size = 0 或 size = 1 (區間裏沒有數或者區間裏已經有序)。

實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
void Swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

int Partition(int* arr, int left, int right)
{
	int begin = left;
	int end = right;
	while (begin < end)
	{
		while (begin < end && arr[begin] <= arr[right])
		{
			begin++;
		}
	while (begin < end && arr[end] >= arr[right])
		{
			end--;
		}
		Swap(arr + begin, arr + end);
	}
	Swap(arr + begin, arr + right);
	return begin;
}

void _QuickSort(int* arr, int left, int right)
{
	if (left == right)
	{
		//若區間裏只剩一個數了
		return;
	}

	if (left > right)
	{
		//區間裏沒有數了
		return;
	}

	int div = Partition(arr, left, right);
	_QuickSort(arr, left, div - 1);
	_QuickSort(arr, div + 1, right);
}

void QuickSort(int* arr, int size)
{
	_QuickSort(arr, 0, size - 1);
}

void Print(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d  ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };
	int size = sizeof(arr) / sizeof(arr[0]);
	printf("----------測試快速排序----------\n");
	printf("排序之前爲: ");
	Print(arr, size);
	QuickSort(arr, size);
	printf("排序之後爲: ");
	Print(arr, size);
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述

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