堆排序實現

2021-08-21 10:31:05 字數 1848 閱讀 7397

堆排序的實現與優先佇列相似。本文先給出堆排序**,然後對其中要點進行解釋,程式中的注釋已經很詳細了。接著,給出乙個應用對排序的程式設計題(華為筆試題)。

例項:從小標0開始存放資料,利用陣列實現大頂堆,從而實現堆排序。

#include using namespace std;

#define elementtype int

void showfunc(elementtype a, int n)

//堆有序函式:保證以i為根節點的樹有序

void adjustdown(elementtype arr,int i,int n)

arr[i] = tmp;

}//將元素按大頂堆進行儲存

void makeheap(elementtype arr, int n)

void swap(elementtype *a, elementtype *b)

//公升序排列函式

void heapsort(elementtype arr, int len)

}int main()

主要思路就是從最後乙個二叉樹構建堆。若資料從小標[0]開始存放,那可第k個結點的父結點為(k-1)/2,其結點為2k+1和2k+2。據此,最後乙個葉子結點的父節點即最後乙個二叉樹的下標為n/2-1,n表示資料總個數。

2、排序

將大頂堆對頂資料與最後乙個資料進行交換,此時,最後乙個資料就是整個資料中的最大值;

經過交換後,其餘資料可能已經不是堆有序的,需要重新調整,具體方法是對判斷堆頂元素是否需要「下沉」,注意此時不需要考慮最後乙個元素;

如此迴圈,得到堆排序後的資料。

for (i = len - 1; i >= 0; i--)

例項:

問題描述:輸入一串以逗號分隔的字串,將最夠乙個字元作為優先順序,將其按優先順序輸出。

輸入:b2,a1,a3,c5,m4

輸出:c5,m4,a3,b2,a1

#include #include #include #include using namespace std;

void adjustdown(vector&v, int i, int n)

if (tmpch < v[child][v[child].length() - 1])

v[i] = v[child];

else

break;

} v[i] = tmp;

}int main()

cout << "原始序列:" << endl;

for (int i = 0; i < v.size(); ++i)

cout << v[i] << endl;

//構建大頂堆

for (int i = v.size() / 2 - 1; i >= 0; i--)

adjustdown(v, i, v.size());

cout << "大頂堆堆序列:" << endl;

for (int i = 0; i < v.size(); ++i)

cout << v[i] << endl;

//堆排序

for (int i = v.size() - 1; i >= 0; i--)

cout << "排序後的序列:" << endl;

for (int i = v.size(); i >=0; i--)

cout << v[i] << endl;

system("pause");

return 0;

}

堆排序實現

今天抽空寫了個堆排序的演算法,廢話不多說,直接上源 include include includeusing namespace std define maxsize 6 void print int a,int size maxsize void percolate up int a,int si...

堆排序實現

1 堆排序演算法描述 1 定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 2 當然,這是小根堆,大根堆則換成 號。k i 相當於 二叉樹的非 葉子結點,k 2i 則是左子節點,k 2i 1 是右子節點...

實現堆排序

堆排序是在程式設計中經常用到的東西,在c 的stl底層裡面有make heap,push heap,pop heap 和 sort heap四個介面函式,我們用到的最多的是stl中的priority queue,其中的底層也是利用前面幾個函式實現的。下面我們就自己實現以下堆排序,主要包括調整堆結構,...