【資料結構】堆排序的向下調整演算法
阿新 • • 發佈:2021-01-04
演算法解析
要明白向下調整演算法首先要掌握資料結構中堆的定義(不是記憶體中的堆)。
1·概念:堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構。
2·堆的分類:最大堆:每個父節點的值都大於孩子節點。最小堆:每個父節點的值都小於孩子節點
向下調整演算法的作用就是通過從上到下的演算法排序,將任意一個堆變成最小堆或者最大堆。
步驟:(此處以最小堆為例)
1、從根節點的左右孩子中選取一個較小值min
2、當前需要調整的資料與較小值min進行比較①、大於min:和min進行交換,從交換後的位置繼續執行第1步;
②、小於等於min:結束
程式碼實現
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//向下調整演算法---以最小堆為例
void Shift_down(int *arr, int n, int curpos) //n-陣列大小 curpos-需要調整的位置
{
//左孩子
int child = 2 * curpos + 1;
while (child < n)
{
if (child + 1 < n&&arr[child + 1] < arr[child])
child++;
//向下比較
if (arr[child] < arr[curpos])
{
int tmp = arr[child];
arr[child] = arr[curpos];
arr[curpos] = tmp;
//繼續向下比較
curpos = child;
child = 2 * curpos + 1;
}
else
break;
}
}
void test()
{
int arr[] = { 10,5,3,8,7,6 };
Shift_down(arr, sizeof(arr) / sizeof(arr[0]), 0);
}
int main ()
{
test();
return 0;
}
除錯結果
測試用例:陣列【10,5,3,8,7,6】
預測輸出結果:【3,5,6,8,7,10】
實際輸出結果: