1. 程式人生 > >希爾排序,快速排序,堆排序

希爾排序,快速排序,堆排序

最近在準備資料結構的考試,於是用部落格記錄下自己複習的過程。今天的內容是三種高階排序。
希爾排序
當序列增量為incr[k]=2(t-k+1)-1時,時間複雜度為O(n1.5)。以序列增量分組,對每組進行大小調整。

template<class T>
void ShellInsert(T elem[],int n,int incr)
{
	for(int i=incr;i<n;i++)
	{
		T e=elem[i];
		for(int j=i-incr;j>=0&&e<elem[j];j-=incr)
			elem[j+incr]=elem[j];
		elem[j+incr]=e;			
	}
}
template<class T>
void ShellSort(T elem[],int n,int incr[],int t)
{
	for(int k=0;k<t;k++)
		ShellInsert(elem,n,incr[k]);
}

快速排序
快速排序被公認為在所有同數量級O(nlogn)的排序演算法中平均效能最好,但如果原序列有序時,快速排序將蛻化為起泡排序,時間複雜度為O(n^2).

template<class T>
int Patition(T elem[],int low,int high)
{//找到序列中一個數使得左邊的數都比他小,右邊的數都比他大。
	while(low<high)
	{
		while(low<high&&elem[low]<=elem[high])
			high--;
		Swap(elem[low],elem[high]);
		while(low<high&&elem[low]<=elem[high])
			low++;
		Swap(elem[low],elem[high]);
	}
	return low;
}
template<class T>
void QuickSortHelp(T elem[],int low,int high)
{//進行遞迴調整
	int pos=Partition(elem,low,high);
	QuickSortHelp(low,pos-1);
	QuickSortHelp(pos+1,high);
}
template<class T>
void QuickSort(T elem[],int n)
{
	QuickSortHelp(elem,0,n-1);
}

堆排序
最壞情況下時間複雜度為O(nlogn),只佔用一個用於臨時交換的臨時儲存空間

template<class T>
void SiftAdjust(int elem[],int high,int low)
{//elem中除elem[low]外均符合堆的定義,調整elem[low]使其成為大頂堆
	for(int f=low,i=2*f+1;i<=high;i=2*i+1)
	{	
		if(i<high&&elem[i]<elem[i+1])
			i++;
		if(elem[f]>=elem[i])
			break;
		Swap(elem[f],elem[i]);
		f=i;
	}
}
template<class T>
void HeapSort(int elem[],int n)
{//先將整個陣列調整為大頂堆,再將最大的元素與最後一個元素交換,調整其成為大頂堆
	int i;
	for(i=(n-2)/2;i>=0;i--)
		SiftAdjust(i,n-1);
	for(i=n-1;i>=0;i--)
	{
		Swap(elem[0],elem[i]);
		SiftAdjust(0,i-1);
	}
}