#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;
}
【排序算法】之堆排序的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.