堆排序

堆排序

先看兩個定義:

大根堆,小根堆類似於二叉樹的結構

大根堆:根比左右結點都大

小根堆:根比左右結點都小

堆排序主要是堆調整函數,進行一次堆調整後找到最大或者最小,此後此結點不參與調整,已經排序好了。


然後把555和17交換,555就放在了應該放的位置。

//////堆調整函數////////
void heap_adjust(int *arr,int len)
{
	//把數組看成二叉樹
	//從結點開始調整,葉節點無左右孩子
	for (int i=len/2-1;i>=0;--i)
	{
		int tmp = i;
		if (2*i+1 < len && arr[tmp]<arr[2*i+1])
			tmp=2*i+1;
		if (2*i+2 < len && arr[tmp]<arr[2*i+2])
			tmp=2*i+2;
		//找出左右節點和根節點中的最大值,放到根節點
		if (tmp != i)
		{
			swap(&arr[i],&arr[tmp]);
		}	
	}
	//一次調整後,把最大值換到最後
	swap(&arr[0],&arr[len-1]);
}

void HeapSort(int *arr,int len)
{
	assert(NULL != arr);
	for (int i=len;i>0;--i)
	{
		//參與調整的數越來越少
		heap_adjust(arr,i);
	}
}

就完成了堆排序




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