C 八種基本排序 堆排序(6)

2021-10-02 16:48:41 字數 1703 閱讀 7496

知識擴充

完全二叉樹的特點:

從作為第一層的根開始,除了最後一層之外,第n層的元素個數都必須是2的n次方;第一層2個元素,第二層4個,第三層8個,以此類推。

每一行的元素都從最左邊開始安放(生成的順序是從上往下,從左往右),兩個元素之間不能有空閒

堆的性質:

小根堆與大根堆的定義:

堆排序原理:

堆頂元素(即二叉堆的根節點)一定為堆中的最大值或最小值,因此如果我們輸出堆頂元素後,將剩餘的元素再調整為二叉堆,繼而再次輸出堆頂元素,再將剩餘的元素調整為二叉堆,反覆執行該過程,這樣便可輸出乙個有序序列,這個過程我們就叫做堆排序。

思路:

先n個元素的無序序列,構建成大頂堆

將根節點與最後乙個元素交換位置,(將最大元素"沉"到陣列末端)

交換過後可能不再滿足大頂堆的條件,所以需要將剩下的n-1個元素重新構建成大頂堆

重複步驟 2,直到堆的尺寸為 1

**堆排序

演算法解析:

堆排序是不穩定排序,時間複雜度為o(nlogn)。

在排序時,如果要排序後的順序為從小到大,則需選擇最大堆,反之,選擇最小堆。

為什麼得從最後乙個非葉子結點往前遍歷呢?

因為堆的向下調整演算法是有前提的:它的左右子樹必須為堆

c**如下:

#include

#include

//構建大頂堆

void

heapadjustdown

(int

*arr,

int start,

int end)

//如果子節點向上移動,將被替換掉的父節點重新賦值

arr[start]

= temp;

}//堆排序後的順序為從小到大,因此需要建立最大堆

void

heapsort

(int

*arr,

int len)

}int

main()

;int num =

sizeof

(arr)

/sizeof

(arr[0]

);heapsort

(arr, num)

;printf

("堆排序後的順序:");

for(i =

0; i

)printf

("%d "

, arr[i]);

printf

("\n");

system

("pause");

return0;

}

**生成圖:

C 八種基本排序 選擇排序(2)

選擇排序 原理 從頭至尾掃瞄序列,找出最小的乙個元素,和第乙個元素交換,接著從剩下的元素中繼續這種選擇和交換方式,最終得到乙個有序序列。思路 在長度為n的無序陣列中,第一次遍歷n 1個數,找到最小的數值與第乙個元素交換 第二次遍歷n 2個數,找到最小的數值與第二個元素交換 第n 1次遍歷,找到最小的...

C 八種基本排序 插入排序(3)

直接插入排序 原理 將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序。思想 將陣列的第乙個數認為是有序陣列,從前往後 或者從後往前 掃瞄該有序陣列,把陣列中其餘n 1個數,根據數值的大小,插入到有序陣列中,直至陣列中的所有數有序排列為止。直接插...

排序6 堆排序

6.1概念以及分類 6.1.1樹 學堆需要的基礎 度的概念 出度 樹中乙個數字下面的數如 上圖2的出度為4,4的出度為0 入度 上乙個數 二叉樹 整個樹中最多有兩個分叉 出度 子節點,父節點 2,3是1的孩子節點分別為左孩子,右孩子。1是2,3的父節點 或雙親節點 2是4,5的父節點。葉子結點 4,...