知識擴充
完全二叉樹的特點:
從作為第一層的根開始,除了最後一層之外,第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,...