1. 程式人生 > 其它 >【資料結構】堆排序的向下調整演算法

【資料結構】堆排序的向下調整演算法

技術標籤:資料結構資料結構堆排序演算法

演算法解析

要明白向下調整演算法首先要掌握資料結構中堆的定義(不是記憶體中的堆)。
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】

實際輸出結果:
在這裡插入圖片描述