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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆操作与堆排序

發(fā)布時間:2024/4/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆操作与堆排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先,我們來認(rèn)識堆:

?

堆的建立:將給定的序列按層次遍歷建立完全二叉樹,然后從最后一個非終端結(jié)點(diǎn)開始自下向上逐步調(diào)整為堆。

?

這里就有兩個重要的操作,shift_up(int t)和shift_down(int t),這樣我們就建立了堆。

對于堆排序,就相當(dāng)于每次取出堆頂?shù)脑刂?#xff0c;這樣是從大到小排序的,因?yàn)榻⒌氖谴箜敹选6雅判蚴且环N樹型

選擇排序。

?

現(xiàn)在來詳細(xì)說一點(diǎn):比如對于序列:5 8 9 7 6 4

按照層次遍歷建立完全二叉樹得到:

?

?

然后自底向上調(diào)整為大頂堆。

?

?

對于插入操作,是在原來堆的后面加上被插入的元素,然后自下而上調(diào)整堆,每次操作復(fù)雜度為O(log(n))。

對于刪除操作,就是把位于堆最后的那個元素覆蓋到被刪除元素的位置,然后調(diào)整堆,堆的size--。

?

而對于堆排序,就是每次刪除堆頂元素,把每次刪除的元素值保存在S[]里,刪除完畢后得到序列是一個有序序列,

也就是完成了排序,這樣可以知道堆排序的時間復(fù)雜度為O(nlog(n))。

?

#include <iostream> #include <string.h> #include <stdio.h>using namespace std; const int N = 105;int Heap[N]; int size;void shift_up(int t) {bool done = 0;if(t == 0) return;while(t != 0 && !done){if(Heap[t] > Heap[(t-1)/2])swap(Heap[t],Heap[(t-1)/2]);elsedone = 1;t = (t-1)/2;} }void shift_down(int t) {bool done = 0;if(2*t+1 > size) return;while(2*t+1 < size && !done){t = 2 * t + 1;if(t+1 < size && Heap[t+1] > Heap[t]) t++;if(Heap[(t-1)/2] < Heap[t])swap(Heap[(t-1)/2],Heap[t]);elsedone = 1;} }void Insert(int x) {if(size >= N) return;size++;Heap[size-1] = x;shift_up(size-1); }void Delete(int t) {int last = Heap[size-1];size--;if(t == size) return;Heap[t] = last;shift_down(t); }int Delete_maxval() {int tmp = Heap[0];Delete(0);return tmp; }int main() {int n;while(cin>>n){size = 0;for(int i=0;i<n;i++){int val;scanf("%d",&val);Insert(val);}while(size > 0)cout<<Delete_maxval()<<" ";cout<<endl;}return 0; }


?


總結(jié)

以上是生活随笔為你收集整理的堆操作与堆排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。