1.堆是一種資料結構
可以將堆看作一棵完全二叉樹,這棵二叉樹滿足,任何乙個非葉節點的值都不大於(或不小於)其左右孩子節點的值。
2.堆的儲存
一般用陣列來表示堆,若根節點存在於序號0處,i結點的父結點下表就為(i-1)/2,i結點的左右子結點下標分別為2i+1和2i+2
3.堆排序思想
利用大頂堆(小頂堆)堆頂記錄的是最大關鍵字(最小關鍵字)這一特性,使得每次從無序中選擇最大記錄(最小記錄)變得簡單。
4.堆排序的實現
堆排序需要解決兩個問題:
針對第二個問題:一般在輸出堆頂元素之後,視為將這個元素排除,然後用表中最後乙個元素填補它的位置,自上向下進行調整:首先將堆頂元素和它的左右子樹的根結點進行比較,把最小的元素交換到堆頂;然後順著被破壞的路徑一路調整下去,直至葉子結點,就得到新的堆。
step 1: 構造初始堆
初始化堆時是對所有的非葉子結點進行篩選
最後乙個非終端元素的下標是[n/2]向下取整,所以篩選只需要從第[n/2]向下取整個元素開始,從後往前進行調整。
step 2:進行堆排序
堆排序是一種選擇排序。建立的初始堆為初始的無序區。
排序開始,首先輸出堆頂元素(因為它是最值),將堆頂元素和最後乙個元素交換,這樣,第n個位置(即最後乙個位置)作為有序區,前n-1個位置仍是無序區,對無序區進行調整,得到堆之後,再交換堆頂和最後乙個元素,這樣有序區長度變為2。。。
不斷進行此操作,將剩下的元素重新調整為堆,然後輸出堆頂元素到有序區。每次交換都導致無序區-1,有序區+1。不斷重複此過程直到有序區長度增長為n-1,排序完成。
5.堆排序例項
1)首先,建立初始的堆結構圖
2)然後,交換堆頂的元素和最後乙個元素,此時最後乙個位置作為有序區(有序區顯示為黃色),然後進行其他無序區的堆調整,重新得到大頂堆後,交換堆頂和倒數第二個元素的位置……
3)重複此過程
4)最後,有序區擴充套件完成即排序完成
由排序過程可見,若想得到公升序,則建立大頂堆,若想得到降序,則建立小頂堆。
6.堆排序分析
穩定性:
時間複雜度:o(nlogn)
空間複雜度:
堆排序方法對記錄數較少的檔案並不值得提倡,但對n較大的檔案還是很有效的。因為其執行時間主要耗費在建初始堆和調整建新堆時進行的反覆「篩選」上。
用Python實現八大排序演算法 氣泡排序
冒泡重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。氣泡排序 defbubble sort lists count len lists for i in range 0,count for j ...
用Python實現八大排序演算法 快速排序
一 概述 最近在用python學習經典的8大排序演算法,以鞏固基礎知識,同時強化自己的python技能。下面對快速排序做乙個簡要介紹。快速排序 設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面...
八大排序演算法python實現
1.氣泡排序 氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,故名。步驟 比較相鄰的元素。如果第乙個比第二個大,就交...