日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3. 堆排序

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的3. 堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。