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)文章
C++中復(fù)制構(gòu)造函數(shù)和重載賦值操作符總結(jié)
這篇文章主要介紹了C++中復(fù)制構(gòu)造函數(shù)和重載賦值操作符總結(jié),本文對復(fù)制構(gòu)造函數(shù)和重載賦值操作符的定義、調(diào)用時機(jī)、實現(xiàn)要點、細(xì)節(jié)等做了總結(jié),需要的朋友可以參考下2014-10-10詳解C語言中fseek函數(shù)和ftell函數(shù)的使用方法
這篇文章主要介紹了C語言中fseek函數(shù)和ftell函數(shù)的使用方法,兩個函數(shù)分別用于設(shè)置和返回文件指針stream的位置,需要的朋友可以參考下2016-03-03關(guān)于Qt添加opencv和libtorch庫的問題
這篇文章主要介紹了Qt添加opencv和libtorch庫的相關(guān)知識,兩種方法一種是通過手動添加,一種是通過qt creator添加,需要的朋友可以參考下2022-01-01cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢
這篇文章主要為大家詳細(xì)介紹了cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12