【排序算法】之堆排序的實現

#include<iostream>
using namespace std;

/*
	1:找到第一個非葉子節點的位置cur:數組元素個數size/2-1
	2:從cur開始,依次將各子樹調整爲最大堆--->整體成爲最大堆
	3:堆頂元素與數組最後一個元素交換
	4:數組元素減1,重複執行上述操作
*/
void AdjustUp(int *arr, int size)
{
	int cur = size / 2 - 1;//指向第一個非葉子節點
	while (cur >= 0)
	{
		int left = cur * 2 + 1;//該節點的左孩子
		int max = left;
		int right = left + 1;  //該節點的右孩子
		//求出左右孩子中較大的節點
		if (right < size&&arr[right] > arr[max])
		{
			max = right;
		}
		//左右孩子中較大的節點,與根節點比較,根節存放較大值
		if (arr[max] > arr[cur])
		{
			swap(arr[max], arr[cur]);
		}
		//爲下一顆樹調整做準備
		cur--;
	}
}
void HeapSort(int *arr, int size)
{
	for (int i = size; i > 1; --i)
	{
		AdjustUp(arr, i);//調整爲最大堆
		swap(arr[0], arr[i - 1]);
        //1:將堆頂元素與數組最後一個元素交換
		//2:然後堆元素個數減1,重新調整爲最大堆,重複1操作
	}
}
void Print(int *arr, int size)
{
	for (int i = 0; i < size; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

int main()
{
	int arr[] = { 2, 9, 7, 15, 8, 21, 12, 100, 99 };
	int size = sizeof(arr) / sizeof(arr[0]);

	HeapSort(arr, size);
	Print(arr, size);
	system("pause");
	return 0;
}

發佈了133 篇原創文章 · 獲贊 86 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章