數據結構-排序算法、選擇排序、堆排序

堆是具備如下性質的徹底二叉樹:每一個結點的值都大於或等於左右孩子結點的值,稱之爲大頂堆,或者每一個結點的值都小於或等於左右孩子結點的值,稱之爲小頂堆。堆排序由如下步驟構成:數組

1.將無序序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆。ui

2.將堆頂元素與末尾元素進行交換-將最大元素「沉」到數組末端code

3.從新調整結構,使其知足堆的定義,而後繼續交換堆頂與當前末尾元素。直到整個序列有序。排序

//堆排序
/*******************************************************************/
//調整堆爲大頂堆
void adjustHeap(int *a,int i, int size)    
{
	int lchild = 2 * i;   //左孩子
	int rchild = 2 * i + 1;   //右孩子

	int maxIndex = i;   //最大值的下標
	if (i<=size/2)
	{
		if (lchild <= size && a[lchild] > a[maxIndex])
		{
			maxIndex = lchild;
		}
		if (rchild <= size && a[rchild] > a[maxIndex])
		{
			maxIndex = rchild;
		}
		if (maxIndex != i)
		{
			int temp = a[maxIndex];
			a[maxIndex] = a[i];
			a[i] = temp;
			adjustHeap(a, maxIndex, size);   //i<=size/2是防止此處對葉子節點進行調整
		}
	}
}
//創建大頂堆
void buildHeap(int *a, int size)
{
	int parentNode = size / 2;    //最大非葉子節點
	for (int i=parentNode;i>=1;i--)
	{
		adjustHeap(a, i, size);
	}
}
//堆排序實現
void heapSort(int *a, int size)
{
	for (int i=size;i>1;i--)
	{
		buildHeap(a, i);
		int temp = a[i];
		a[i] = a[1];
		a[1] = temp;
	}
}
相關文章
相關標籤/搜索