1. 程式人生 > >基礎演算法學習——快速排序

基礎演算法學習——快速排序

快速排序是分治法的典型應用,它的大概的一個實現思路是:任意去一個數,將比它大的數放在該數右邊,比它小的數放在它左邊(反過來也行)。然後又將左右兩邊的數進行該操作,直到只剩下一個數了,也就不用排序了。我們看下程式碼:

 

#include<stdio.h>
//這裡交換值 
void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}
//快排函式 
void QuickSort(int a[],int left,int right)
{
	int key,i,j;
	//我們讓這個關鍵數為最左邊的數 
	key=a[left];
	i=left;j=right;
	//當只有一個數時不用排了 
	if(left>=right)
		return;
	while(i!=j)
	{
		while(j>i&&a[j]>key)
			j--;
		swap(a[i],a[j]);
		while(j>i&&a[i]<key)
			i++;
		swap(a[i],a[j]);
	}
	
	QuickSort(a,left,i-1);
	QuickSort(a,i+1,right);
	
}
int main()
{
	int i;
	int a[]={2,5,8,4,69,31,94,82,76};
	QuickSort(a,0,8);
	for(i=0;i<9;i++)
	printf("%d  ",a[i]);
	return 0;
} 

這裡說明一點點,我們的平均時間複雜度是 O(nlog n)我們都是取最左邊的數為關鍵值,但是會有個缺點,如果我們的陣列本來就是排好序的,那麼會使得左邊永遠沒有二分進去,這就使得只有右邊這一部分在工作,所以複雜度又回到O(n^2).這裡有個辦法就是,先隨機打亂再使用快排就是 O(nlog n)了。每星期幾道演算法,我相信日積月累。