1.概述
2023年計算機先驅將獲得者、史丹福大學電腦科學系教授robert w.floyd和j. williams在2023年共同發明了著名的heap sort演算法。
堆排血實質上就是將要進行排序的序列arr[1..n]看做是一棵完全二叉樹的儲存結構,堆則是滿足如下性質的完全二叉樹:樹中任一非
葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。(如果按照陣列中線性儲存該樹,可得到乙個既不是單調
遞增也不是單調遞減的序列)
(1)堆排序與直接選擇排序的區別
直接排序的缺點:直接選擇排序過程中,為從arr[1..n]中選擇出關鍵字最大的記錄,必須進行n-1次比較,然後在arr[2...n]中選出關
鍵字最大的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面n-1比較中已經做成的,但是由於前一趟
比較過程中未保留這些比較結果,所以後一趟排序執行了這些比較操作。
堆排序:堆排序可以通過樹型結構儲存部分比較結果,從而可以大大減少比較的次數。
(2)大堆排序的基本思想
首先將arr[1..n]建成乙個大根堆,此堆為初始的無序區。再將關鍵字最大的記錄arr[i]和無序區的最後乙個記錄arr[n]交換,由此得到
了乙個新的無序區arr[1..n-i]和有序區arr[...n],且滿足arr[1..n-i]2. 編輯環境
netbeans c++ 6.5
window xp
3.問題概述及演算法實現
問題:從十億個數中取出前十個最大的數。(只想到用該演算法去實現了,如果有更好的實現方法,可以share)
程式:
呼叫示例
排序演算法 堆排序
1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...
排序演算法 堆排序
花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...
排序演算法 堆排序
由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...