1. 程式人生 > >快速排序優化通過中位數優化

快速排序優化通過中位數優化

<span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
//交換位置傳入兩個地址
void Swap(int *a, int *b)   
{
	int temp;
	temp = *b;
	*b = *a;
	*a = temp;
}

//求出三個數的中位數並且將pivot(關鍵字放在i-1的位置上)
int Median3(int A[],int Left,int Right) //left = 起點 right = 終點
{
	int Center = (Left + Right) / 2;    //找出中間位置用Center儲存
	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]);       //將中位數藏到right-1的位置上
	return A[Right-1];
}

//排序演算法的實現傳入三個引數 Left = 起點 Right = 終點
void Quicksort(int A[],int Left,int Right)
{
	int Pivot = Median3(A,Left,Right);           //做子集劃分的時候處理關鍵字
	int i = Left;                            //不用考慮第一個和最後一個在中位數裡已經處理過
	int j = Right-1;

    //子集劃分不斷迴圈
	while(1)
	{
		while ( A[ ++i ] < Pivot ) { }
		while ( A[ --j ] > Pivot ) { }
		if ( i < j )
			Swap( &A[i], &A[j] );
		else break;
	}
	Swap(&A[i],&A[Right-1]);         //繼續藏位置
	if(Left < i-1)
	Quicksort(A,Left,i-1);           //從中間位置到初始位置
	if(i+1 < Right)                  //注意這裡是三個數已排好了
	Quicksort(A,i+1,Right);          //兩個遞迴所以兩個判斷條件
}

//對快排進行封裝
void Quick_Sort(int A[],int N)
{
	Quicksort(A,0,N-1);
}

int main()
{
	int a[14] = {10,7,2,5,3,4,9,11,15,12,20,902,50,30};
	Quick_Sort(a,14);
	for(int i=0;i<14;i++)
	{
		printf("%d ",a[i]);
	}
	getchar();
}