堆排序演算法

2021-06-08 14:48:21 字數 2242 閱讀 3137

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)

程式:[cpp]view plain

copy

print?

/*堆排序,陣列元素下標從1開始到size

*/// 從第m個節點開始堆化

static

void hpshift(int* arr, const

int m, const

int size)  

int t = arr[m];  

int i = m * 2; // 指示孩子節點

while (i <= size)  

// 已經堆隊行

if (t >= arr[i])  

// shift

arr[i / 2] = arr[i];  

i *= 2;  

}  arr[i / 2] = t;  

}  void hpsort(int* arr, const

int size)  

// 自底向上堆化

int m = size / 2;  

for (; m >= 1; --m )  

// 無序區 + 有序區

int t;  

for (m = size; m >= 1; --m)  

}  呼叫示例

[cpp]view plain

copy

print?

#include 

#include "demo.h"

template

void printarr(t* arr, int

const size);  

int main()  

; //  std::cout << find_lost(a,6) << std::endl;   

// 堆排序

intconst size = 10;  

int arr[size] = ;  

printarr(arr, size);      

hpsort(arr, size - 1);  

printarr(arr, size);  

return exit_success;  

}  template

void printarr(t* arr, int

const size)  

int ind = 1;  

for (ind = 1; ind < size; ++ind )   

std::cout << std::endl;  

for (ind = 1; ind < size; ++ind)  

std::cout << std::endl;  

for (ind = 1; ind < size; ++ind )   

std::cout << std::endl;  

}  

排序演算法 堆排序

1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...

排序演算法 堆排序

花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...

排序演算法 堆排序

由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...