快速排序

1、算法原理

快速排序(quicksort)是在實踐中最快的已知排序算法,它的平均運行時間是O(NlogN)。該算法之所以特別快,主要是由於非常精煉和高度優化的內部循環。像歸併排序一樣,快速排序也是一種分治的遞歸算法。將數組S排序的基本算法由下列簡單的四步組成:

(1)如果S中元素個數是0或1,則返回。

(2)取S中一個元素v,稱之爲樞紐元(pivot)。

(3)將S-{v}(S中其餘元素)分成兩個不相交的集合:S1={x∈S-{v}|x≤v}和S2={x∈S-{v}|x≥v}。

(4)返回{quicksort(S1)}後,繼隨v,繼而{quicksort(S2)}。


2、代碼

/*+++++++++++++++++++++++++++++++++++++
+	快速排序(C版)
+
+author:zhouyongxyz	2013-4-15 9:39
+++++++++++++++++++++++++++++++++++++*/
#include <cstdio>

#define N 8
typedef int ElementType;
void Swap(ElementType &a,ElementType &b);
ElementType Median3(ElementType a[],int left,int right);
void QSort(ElementType a[],int left,int right);
void QuickSort(ElementType a[],int n);

int main()
{
	int a[N]={4,3,5,2,9,7,6,8};
	QuickSort(a,N);
	for(int i=0;i<N;i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}

void QuickSort(ElementType a[],int n)
{
	QSort(a,0,n-1);
}

ElementType Median3(ElementType a[],int left,int right)
{
	int center=(left+right)/2;
	if(a[left]>a[center])
		Swap(a[left],a[center]);
	if(a[left]>a[right])
		Swap(a[left],a[right]);
	if(a[center]>a[right])
		Swap(a[center],a[right]);
	Swap(a[center],a[right-1]);

	return a[right-1];
}

void Swap(ElementType &a,ElementType &b)
{
	int tmp;
	tmp=a;
	a=b;
	b=tmp;
}

void QSort(ElementType a[],int left,int right)
{
	int i,j;
	ElementType pivot;
	if(left<right)
	{
		pivot=Median3(a,left,right);
		i=left;
		j=right-1;
		while(1)
		{
			while(a[i]<pivot) i++;
			while(a[j]>pivot) j--;
			if(i<j)
				Swap(a[i],a[j]);
			else
				break;
		}
		QSort(a,left,i-1);
		QSort(a,i+1,right);
	}
}


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