c++實現(xiàn)堆排序的示例代碼
看了一下優(yōu)先隊列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交換2個操作。如果建的是最大堆,那么交換的時候,父節(jié)點就和最大的子節(jié)點比較,如果它比最大的子節(jié)點還大,那就不用比了。因為后面還有一個交換的操作,所以最后得到的就是由小到大的排序;反之,得到的就是由大到小的排序。
#include<iostream>
#include<algorithm>
using namespace std;
void maxHeapify(int arr[], int start, int end)
{
int dad = start;
int son = dad * 2 + 1;
while (son <= end) {
if (son + 1 <= end && arr[son] < arr[son + 1]) {
son++;// 找出最大的兒子
}
// 父節(jié)點跟最大的子節(jié)點比較即可
if (arr[dad] > arr[son]) {
return;
}
else {
// 交換父節(jié)點與子節(jié)點
swap<int>(arr[dad], arr[son]);
// 這個時候父節(jié)點位置滿足要求了,下面的子節(jié)點不一定滿足要求
// 還需要檢查有沒有導(dǎo)致下面的子節(jié)點受到影響
dad = son;
son = dad * 2 + 1;
}
}
}
void heapSort(int arr[], int len)
{
// 初始化,從最后一個父節(jié)點開始,調(diào)整所有的父節(jié)點
for (int i = len / 2 - 1; i >= 0; i--) {
maxHeapify(arr, i, len - 1);
}
// 這個時候找到了最大元素(堆頂),
// 將其和最后一個元素交換。(這樣就會得到由小到大的排序)
for (int i = len - 1; i > 0; i--) {
swap(arr[0], arr[i]);
// 將交換之后除了最后一個元素的所有元素,重新調(diào)整為最大堆
maxHeapify(arr, 0, i - 1);
}
}
int main()
{
int arr[]{ 5,3,4,9,7,8,1,2,10,23,15 };
int len = int(sizeof(arr) / sizeof(*arr));
heapSort(arr, len);
cout << "排序之后:" << endl;
for (auto item : arr) {
cout << item << " ";
}
return 0;
}

這幾行代碼干的事情,就是如下圖所示,由低向高,逐漸生成最大堆,找到最大元素

緊接著的后面的for循環(huán)就是最后一個元素和堆頂元素交換,然后重新調(diào)整除了交換到后面來的元素,直到只有堆頂一個元素。就排好序了。

到此這篇關(guān)于c++實現(xiàn)堆排序的示例代碼的文章就介紹到這了,更多相關(guān)c++ 堆排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟
本文主要介紹了CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Qt實現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼
本文主要介紹了Qt實現(xiàn)網(wǎng)絡(luò)聊天室,實現(xiàn)一個在線聊天室, 使用tcp對客戶端和服務(wù)器端進行通訊。具有一定的參考價值,具有一定的參考價值,2021-06-06

