3. 堆排序
一、介紹
堆排序屬于選擇排序,它是利用堆這種數據結構而設計的一種排序算法。
升序排序采用最大堆,而降序排序采用最小堆。
?
二、基本思想
將待排序的數列構造成一個最大堆,每次都取堆頂的元素,將其放在數列的最后面,然后將剩余的元素重新調整為最大堆,依次類推,最終得到升序的序列。
主要過程:構建最大堆 + 交換堆頂元素和末尾元素并重建最大堆
【詳細步驟】
a.將無序序列構建成一個最大堆;
b.將堆頂元素與末尾元素交換,將最大元素"沉"到數組末端;
c.重新調整結構,使其滿足堆定義,然后繼續交換堆頂元素與當前末尾元素。反復執行“調整+交換”步驟,直到整個序列有序。
?
三、代碼
#include <iostream> #include <stack> #include <queue>using namespace std;/* 構造最大堆 */ /** a為待排序的數組 * n是元素的個數,這里假設從下標1開始存放元素,故原數組的大小應為n+1* 于是在完全二叉樹中,由a[father] = a[lChild/2] = a[rChild/2] */ void init(int a[], int n) {for(int i = n / 2; i > 0; --i) {int temp = a[i];int son = i * 2;while(son <= n) {if(son < n && a[son] < a[son+1])son++;if(temp > a[son])break;else {a[son/2] = a[son];son = son * 2;}} a[son/2] = temp;} } int main() {// a[0]不存放元素,所以是對n=7個元素進行排序 int arr[8] = {0, 4, 3, 2, 7, 6, 8, 5}; // 重建+交換 執行n-1次 for(int i = 0; i < 6; ++i) {init(arr, 7 - i); // 構建最大堆 swap(arr[1], arr[7-i]); // 交換堆頂和末尾元素 } for(int i = 1; i <=7; ++i)cout << arr[i] << " ";cout << endl;return 0; }補:上述構建最大堆的算法可查看《最大堆》。
?
轉載于:https://www.cnblogs.com/xzxl/p/9580977.html
總結
- 上一篇: vue学习笔记之:为何data是一个方法
- 下一篇: VMware 即使克隆解析