改進版快速排序(平均複雜度O(NlogN))

#include<iostream>
using namespace std;

#define MAXSIZE  21
typedef int SqList[MAXSIZE];  
#define   ElementType int
void Swap(int &a, int &b)  
{  
    a = a^b;  
    b = a^b;  
    a = a^b;  
} 
 
//*********************************************************
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 ] );
		 
		return A[ Right ]; /* 返回pivot */
}


void Quicksort( ElementType *A, int Left, int Right )
{   
	if(Left>=Right){return ;}
	{
        int	Pivot = Median3( A, Left, Right );
	    int	i = Left; 
	    int j = Right;
		 
		  for( ;  ; )
	 
		{   
			  while ( i<j && A[i] < Pivot ) {  ++i;   }  
			  // 注意這裏是>=否則當Pivot和頭尾數據相等時就會死循環
			  while ( i<j &&  A[j] >= Pivot ) { --j;   }  
			
			if ( i < j )
			Swap( A[i], A[j] );
			else break; 
		}
			Swap( A[i], A[Right] );
	  
		   Quicksort( A, Left, i-1 );
	       Quicksort( A, i+1, Right );
	 
	}
	 
}

void Quick_Sort(ElementType *A,int N)//接口
{
   Quicksort( A, 0, N-1 );
}
//////////////////////////////////////////////////////
 
void main()
{
	SqList sq = {49,38, 65, 97, 76, 13, 27, 49 };
       
	 Quick_Sort( sq,8);//
	 	 for (int i = 0; i < 8; i++)  
    {  
		 cout << sq[i] <<",";  
    }  
    cout << endl;
 
   
}

 


爲了儘可能降低複雜度,出現了一些邊界控制的問題,在老師的幫助下,完成了代碼。

有不足之處,還望指出。

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