這是我最近幾天寫排序的最後乙個演算法排序了
我覺得這個堆排序和歸併排序可以說是這幾個演算法中寫起來最困難的**了。
堆排序:是指利用堆這種資料結構所設計的一種排序演算法。
因為堆是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點,所以建堆就和建樹一樣,必須建好堆再進行排序。
堆排序的時間複雜度為:o(nlog2n),是一種不穩定的排序演算法
**思路:
首先把陣列當成乙個完全二叉樹,保證根結點最大,然後把根結點與最後乙個元素交換,然後再調整二叉樹(逐漸減少陣列),讓根依然保持最大,重複上次操作。
**:#include #define swap(a,b)
void creat_heap(int* arr,size_t root,size_t len)
if(right < len)
if(max != root) }
void heap_sort(int* arr,size_t len)
{ for(int i=0;i選擇排序:
插入排序:
歸併排序:
快速排序:
氣泡排序:
演算法與資料結構之堆排序
堆結構 就是一顆完全二叉樹,二叉樹是不存在的,可以腦補,真正實現堆結構的是陣列 葉節點 沒有左右孩子的節點 滿二叉樹 最後一層都是葉節點,並且填滿最後一層 完全二叉樹 滿二叉樹屬於完全二叉樹,滿二叉樹從右往左依次去葉節點形成的樹就是完全二叉樹 陣列下標位置為i,在不越界的情況下 2 i 1是i位置數...
資料結構與演算法之堆排序
堆排序 先用n個待排序的元素來初始化乙個大根堆,然後從堆中逐個提取元素 刪除 每次都取堆頂的元素,將其放在序列最後面,然後將剩餘的元素重新調整為最大堆,依次類推,最終得到排序的序列。結果這些元素按照非遞增的順序排列。初始化時間為o n 每次刪除的時間為o logn 因此總時間為o nlogn inc...
演算法與資料結構 之堆排序
堆的應用 優先佇列的主要操作 例子 在n個元素中選出前m個元素?比如,在100萬個元素中選出前100名 排序,nlogn 優先佇列,nlogm 維護乙個容量為m的最小堆,遍歷完100萬個陣列之後,形成的最小堆中的m個元素就是最小的 總共n個請求,使用普通陣列或者順序陣列,最差情況o n 2 使用堆,...