1. 程式人生 > >Quicksort快速排序演算法

Quicksort快速排序演算法

快速排序演算法

思想:二分法,分治法,遞迴

排序例項 6 1 2 7 9 3 4 5 10 8 6為基準,也就是temp 先從右找第一個比基準數小的,再從左找第一個比基準數大的,進行交換,這裡必須從右邊先找的原因是因為基準數定的是最左的數。

如果選取最左邊的數a[left]作為基準數,那麼先從右邊開始可保證i,j在相遇時,相遇數是小於基準數的,交換之後temp所在位置的左邊都小於temp。但先從左邊開始,相遇數是大於基準數的,無法滿足temp左邊的數都小於它

找到7 和 5 6 1 2 7 9 3 4 5 10 8

交換後得到 6 1 2 5 9 3 4 7 10 8

依次類推,當得到 i == j 或 i > j時,排序無法繼續進行,此時情況如下 6 1 2 5 4 3

9 7 10 8

此時交換基準數與3 3 1 2 5 4 6 9 7 10 8

這樣就保證了基準數6左邊都比他小,右邊都比他大 這時,再將3設為基準數,在3 1 2 5 4 中進行快速排序,在9 7 10 8中進行快速排序 也就是進行遞迴排序演算法,最終就得到排序結果 1 2 3 4 5 6 7 8 9 10

#include <iostream>

using namespace std;

void QuickSort(int* a, int left, int right) 
{
	int i = left;
	int j = right;
	int temp = a[left];
	int t = 0;
	if (left >= right)
		return;
	while (i != j)
	{
		while (i < j && a[j] >= temp)//a[j]<temp跳出迴圈,找到第一個a[j]<temp
			j--;//從右向左找第一個小於x的數
		while (i < j && a[i] <= temp)//a[i]>temp跳出迴圈,找到第一個a[i]>temp
			i++;//從左向右找第一個大於x的數

		//交換兩個數在陣列中的位置
		if (i < j)
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//將基準數歸位
	a[left] = a[i];
	a[i] = temp;
	QuickSort(a, left, i - 1);
	QuickSort(a, i + 1, right);
	return;
}

int main()
{
	int n;
	int a[101] = {0};
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	QuickSort(a, 0, n-1);

	for (int i = 0; i < n; i++) {
		cout << a[i] << ' ';
	}
	return 0;
}

測試用例:

Input: 11 3 4 5 1 34 61 22 41 111 2 87

Output: 1 2 3 4 5 22 34 41 61 87 111