堆排序模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

template<typename T>
void Swap(T& a,T& b){T t=a;a=b;b=t;}

template<typename T>
void shift(T* ary,int k,int f,bool comp(const T& a,const T&b) )
{
	for(int son=k*2;son<=f;k=son,son=k*2)
	{
		if(son+1<=f&&comp(ary[son+1],ary[son]))
			++son;
		if(comp(ary[son],ary[k]))
			Swap(ary[son],ary[k]);
		else break;
	}
}

template<typename T>
void heapSort(T* ary,int l,int r,bool comp(const T& a,const T&b))//r不是超尾而是最后一个元素 
{
	int mid=(l+r)/2;
	for(int i=mid;i>=l;--i)
		shift(ary,i,r,comp);
	for(int i=r;i>=l+1;--i)
	{
		Swap(ary[i],ary[l]);
		shift(ary,l,i-1,comp);
	}
}
0%