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

快速排序演算法分析

快速排序:它的基本思想是:找出一個元素(理論上可以在所有值中隨便找一個)作為基準,通過一趟排序將要排序的資料分割成獨立的兩部分,基準左邊的資料都小於基準值,右邊的部分都大於基準值,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

用圖來說明一下一趟排序的過程:(最後結果為:[小於基準值]   基準   [大於基準值]    )


平均時間複雜度:O(N*lgN)

最壞時間複雜度:O(N*N) (若每次找到基準是最大值或者最小值,就是最壞情況)

一趟排序過程的程式碼:

int Partition(int arr[],int len,int start,int end)
{
	if (arr == NULL || len < 0 || start < 0 || end >= len)
	{
		return -1;
	}
	
	int small = start - 1;
	int index = start;
	for (; index < end; index++)
	{
		if (arr[index] < arr[end])
		{
			small++;
			if (small != index)
			{
				swap(arr[index], arr[small]);
			}
		}
	}

	++small;
	swap(arr[index], arr[small]);

	return small;
}

快速排序就是對基準左右兩側的資料再次進行上述一趟排序,重複直到結束;
void QSort(int arr[], int len, int start, int end)
{
	if (start == end)
		return;

	int index = Partition(arr, len, start, end);
	if (index > start)
	{
		QSort(arr, len, start, index - 1);
	}
	if (index < end)
	{
		QSort(arr, len, index + 1, end);
	}
}
這就是快速排序。