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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

排序算法 --- 堆排序

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

根據(jù)大頂堆的描述, 父節(jié)點的值始終大于子節(jié)點(如果有的話)的值, 再加上堆是完全二叉樹, 可以用數(shù)組表示, 那么就可以用來進行排序.

具體做法就是, 對于隨機排列的數(shù)組:

1. 首先將其構(gòu)建成一個大頂堆, 根據(jù)堆的性質(zhì), 此時堆頂就是最大值.

2. 把堆頂元素與數(shù)組最后一個元素進行交換, 也就是把最大值換至最后一個元素

3. 把元素個數(shù)減一, 重復(fù)上述兩個步驟

可以看出最復(fù)雜的, 也就是構(gòu)造大頂堆的過程, 對于一個隨機排列的數(shù)組, 其構(gòu)建大頂堆的步驟如下:

假設(shè)有一個數(shù)組A, 共有n(14)個元素(如圖).

1. 首次構(gòu)建時, 需要遍歷所有的子樹, 讓所有的子樹滿足大頂堆性質(zhì), 而只有一個節(jié)點的子樹則不需要遍歷(因為不需要調(diào)整), 所以要從第一個非葉子節(jié)點的子樹開始遍歷, 構(gòu)建大頂堆. 而第一個非葉子節(jié)點的子樹根節(jié)點, 在數(shù)組中的下標為 n / 2 - 1(也就是6, 目前6不需要調(diào)整), 從此開始一直至0(注意當上層樹發(fā)生變化時, 需要遞歸調(diào)整下層的樹, 為什么要從下至上調(diào)整, 因為下層調(diào)整完成后, 已經(jīng)把下層最大的調(diào)整至根節(jié)點了, 這樣當根節(jié)點發(fā)生變化時, 只需要從上向下再調(diào)整一遍, 因為下層已經(jīng)不可能有比上面更大的值了).

例子中的步驟為:

1. 首先遍歷第一個非葉子節(jié)點, 14 / 2 - 1 = 6, 發(fā)現(xiàn)不用調(diào)整, 然后遍歷5, 發(fā)現(xiàn)也不用調(diào)整, 然后遍歷4, 交換4 9的值:

?2. 遍歷3, 交換3 8:

3.? 遍歷2, 不用動, 遍歷1, 交換1 3, 然后發(fā)現(xiàn)68交換到3后, 3 7 8子樹不需要動(就算需要動, 也不需要再動1 3 4了, 因為之前3 7 8已經(jīng)調(diào)整過, 新上來的不可能取代已經(jīng)上去的了):

4. 遍歷0, 交換0 1, 交換1 3, :

?

(3 7 8不再需要調(diào)整, 原因同上一步)

2. 首次構(gòu)建完大頂堆后, 交換首個元素與最后一個元素的值, 然后重新構(gòu)建大頂堆

1. 交換0 13:

2. 數(shù)組長度少一:

3. 從根節(jié)點開始重新構(gòu)建大頂堆, 交換0 2,? 交換2 5:

4. 這樣又重新構(gòu)建成了大頂堆, 重復(fù)上述步驟

代碼:

leetcode鏈接(第912題):?https://leetcode-cn.com/problems/sort-an-array/submissions/

(第215題)

void heapify(vector<int>& nums, int root, int max_index) {int left = 2 * root + 1;if (left > max_index)return;int right = 2 * root + 2;int exchange_index = left;if (right <= max_index && nums[right] > nums[left])exchange_index = right;if (nums[root] < nums[exchange_index]) {swap(nums[root], nums[exchange_index]);heapify(nums, exchange_index, max_index);} } vector<int> sortArray(vector<int>& nums) {int total = nums.size();for (int i = total / 2 - 1; i >= 0; i --) {heapify(nums, i, total - 1);}int target_index = total - 1;while (target_index > 0) {swap(nums[0], nums[target_index]);target_index --;heapify(nums, 0, target_index);}return nums; }

總結(jié)

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

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