希尔排序,快速排序,堆排序

最近在准备数据结构的考试,于是用博客记录下自己复习的过程。今天的内容是三种高级排序。
希尔排序
当序列增量为incr[k]=2(t-k+1)-1时,时间复杂度为O(n1.5)。以序列增量分组,对每组进行大小调整。

template
void ShellInsert(T elem[],int n,int incr)
{
	for(int i=incr;i=0&&e
void ShellSort(T elem[],int n,int incr[],int t)
{
	for(int k=0;k

快速排序
快速排序被公认为在所有同数量级O(nlogn)的排序算法中平均性能最好,但如果原序列有序时,快速排序将蜕化为起泡排序,时间复杂度为O(n^2).

template
int Patition(T elem[],int low,int high)
{//找到序列中一个数使得左边的数都比他小,右边的数都比他大。
	while(low
void QuickSortHelp(T elem[],int low,int high)
{//进行递归调整
	int pos=Partition(elem,low,high);
	QuickSortHelp(elem,low,pos-1);
	QuickSortHelp(elem,pos+1,high);
}
template
void QuickSort(T elem[],int n)
{
	QuickSortHelp(elem,0,n-1);
}

堆排序
最坏情况下时间复杂度为O(nlogn),只占用一个用于临时交换的临时存储空间

template
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=elem[i])
			break;
		Swap(elem[f],elem[i]);
		f=i;
	}
}
template
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);
	}
}
		

你可能感兴趣的:(c-c++,数据结构,排序算法)