堆排序

#include <iostream>
using namespace std;

// 大根堆排序
void HeapAdjust(int array[], int s, int n);
void swap(int array[], int i, int j);
void heapSort(int array[], int n)
{
	// 生成大根堆
	for (int i = n / 2; i > 0; i--)
	{
		HeapAdjust(array, i, n);//從下向上,從右向左調整(從中間節點,總數/2 的下標節點處開始,往下標爲1節點調整)
	}
	for (int i = n; i > 1; i--)
	{
		swap(array, 1, i);// 交換,形成非大根堆
		HeapAdjust(array, 1, i - 1);//從上到下,從左向右調整
	}
}
// 每次調用蓋函數會形成一個大根堆,每個父節點都比其左右子節點打
void HeapAdjust(int array[], int s, int n)
{
	int i, temp;
	temp = array[s];// 保存當前父節點的值
	for (i = 2 * s; i <= n; i *= 2)// for循環將較小的父節點往更底層交換
	{
		// 這條if語句是找出s節點下,左右較小的那個節點i
		if (i < n && array[i] < array[i + 1])//i,i + 1爲節點位置s節點的子節點 i<n判斷是否超出節點數量
		{
			i++;// 較大的子節點
		}
		if (temp >= array[i])// 父節點與較大子節點的比較
		{
			break;// 父節點較大則停止交換
		}
		array[s] = array[i];// 子節點頂替父節點位置
		s = i;// 記錄下父節點 要換到的子節點位置
	}
	array[s] = temp;// 將該子節點置爲父節點的值
}
// 交換當前未調整堆的頭尾節點
void swap(int array[], int i, int j)
{
	int temp;

	temp = array[i];
	array[i] = array[j];
	array[j] = temp;
}


int main()
{
	// 注意:數組從1開始,1~n
	int array[] = { 0, 1, 8, 6, 3, 2, 5, 4, 9, 7 };// 第一個位置不用
	int array1[] = { 0, 1, 8, 6, 3, 2, 0, 5, 4, 9, 7 };// 第一個位置不用
	heapSort(array,9);
	heapSort(array1, 10);
	getchar();
}

 

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