排序算法的C語言實現-堆排序

堆(優先隊列)可以用於花費NlogN時間的排序,基於該想法的算法叫做堆排序。因爲堆的根總是最大的或者最小的,所以我們可以先將輸入數組轉換爲最大或者最小堆,然後刪除最大(最小值)也就是刪除根。這在二叉堆的介紹中已經實現了。一種方法是將刪除的元素放入另一個數組,但是這樣會浪費一倍的內存空間。由於每次刪除後堆的最後一個位置是空的,所以另一種方法是將刪除的元素放入最後的位置。如果是最大堆,那結果就是順序的,如果是最小堆則是逆序的。

void percDown(int a[],int i,int N)
{
	int child;
	int temp;

	for(temp=a[i];(2*i)<N;i=child)
	{
		child=2*i;
		if(child!=N-1&&a[child+1]>a[child])
			child++;
		if(temp<a[child])
			a[i]=a[child];
		else
			break;
	}
	a[i]=temp;
}

void heapSort(int a[],int N)
{
	int i;
	//i從N/2開始是因爲這樣N/2->N都是0-N/2的兒子
	for(i=N/2;i>0;i--)		//將數組調整爲最大堆
	{
		percDown(a,i,N);<span style="white-space:pre">	</span>//調整i元素的位置
	}
	for(i=N-1;i>0;i--)
	{
		swap(&a[0],&a[i]);	//a[0]就是最大值,將最大值放到最後的位置上
		percDown(a,0,i);	//然後重新調整a[0]的位置,這裏只需要調整0到i的堆
	}
} 

void swap(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}


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