【圖解】9張圖徹底搞懂堆排序

點(diǎn)擊上方 "程序員小樂"關(guān)注, 星標(biāo)或置頂一起成長(zhǎng)

每天凌晨00點(diǎn)00分, 第一時(shí)間與你相約

每日英文

Sometimes,God does not give you what you want,it is not because you do not deserve it but for the better.

有時(shí)候,上天沒有給你想要的,不是因?yàn)槟悴慌?,而是你值得更好的?/p>

每日掏心****話

有人說(shuō)人生無(wú)奈,但人定勝天,我們可以改變。的確,也許唯有充實(shí)人生,才能彌補(bǔ)一些遺憾不足,讓自己快樂多一點(diǎn)煩惱少一點(diǎn)。

來(lái)自:CoderJed | 責(zé)編:樂樂

鏈接:jianshu.com/p/3e1d4ed98565

image

程序員小樂(ID:study_tech)第 739 次推文 圖片來(lái)自 Pexels

往日回顧:Java泛型背后是什么?

正文

<article class="" style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">

1. 圖示過(guò)程

大根堆的性質(zhì):

  1. 堆頂?shù)臄?shù)一定是所有元素的最大值

  2. 任何一顆子樹的根元素一定是該子樹的最大元素

  3. 某節(jié)點(diǎn)的左右葉子節(jié)點(diǎn)是無(wú)序的

大根堆與數(shù)組的關(guān)系:計(jì)算機(jī)中是沒有堆或者樹這種概念的,堆或者樹需要使用基本的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn),用數(shù)組表示一個(gè)大根堆的規(guī)律如下:

  1. 數(shù)組索引為 0 的位置存放堆頂?shù)脑?/p>

  2. 數(shù)組索引為 i 的元素的左右葉子節(jié)點(diǎn)的索引是 2 * i + 1 和 2 * i + 2

  3. 數(shù)組索引為 i 的元素的父節(jié)點(diǎn)的下標(biāo)索引為 (i - 1) / 2

(1) 堆排序整體流程

  1. 首先把數(shù)組中的 N 個(gè)數(shù)建成一個(gè)大小為 N 的大根堆
image
  1. 然后把堆頂?shù)臄?shù)和堆的最后一個(gè)數(shù)交換:
image
  1. 此時(shí)數(shù)組的最后一個(gè)值就是最大值
image
  1. 然后把推中的最后一個(gè)元素剔除,把剩余的元素再次調(diào)整為一個(gè)大根堆
image
  1. 然后把堆頂元素與最后一個(gè)元素交換位置
image
  1. 此時(shí)數(shù)組的倒數(shù)第二個(gè)元素就是數(shù)組中第二大的元素。
image
  1. 重復(fù)以上過(guò)程,當(dāng)堆的大小為 1 的時(shí)候,數(shù)組就有序了。

(2) 堆化過(guò)程

將一個(gè)數(shù)組轉(zhuǎn)化為一個(gè)大根堆的過(guò)程稱為堆化,堆化的過(guò)程如下:

  1. 原數(shù)組對(duì)應(yīng)的數(shù)結(jié)構(gòu)為:
image
  1. 從第一個(gè)元素開始遍歷,只要它的值比父節(jié)點(diǎn)大,就把它和父節(jié)點(diǎn)相互交換。
image

2. 展示

<article class="" style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">
</article>

</article>

image

<article class="" style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">

3. Java代碼實(shí)現(xiàn)

public static void heapSort(int[] arr) {    if (arr == null || arr.length < 2) {        return;    }    for (int i = 0; i < arr.length; i++) {        heapInsert(arr, i);    }    int size = arr.length;    swap(arr, 0, --size);    while (size > 0) {        heapify(arr, 0, size);        swap(arr, 0, --size);    }}public static void heapInsert(int[] arr, int index) {    while (arr[index] > arr[(index - 1) / 2]) {        swap(arr, index, (index - 1) / 2);        index = (index - 1) / 2;    }}/** * 堆化 */public static void heapify(int[] arr, int index, int size) {    int left = index * 2 + 1;    while (left < size) {        int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;        largest = arr[largest] > arr[index] ? largest : index;        if (largest == index) {            break;        }        swap(arr, largest, index);        index = largest;        left = index * 2 + 1;    }}public static void swap(int[] arr, int i, int j) {    int tmp = arr[i];    arr[i] = arr[j];    arr[j] = tmp;}

4. 復(fù)雜度

  • 時(shí)間復(fù)雜度:O(nlogn)

  • 空間復(fù)雜度:O(1), 只需要一個(gè)額外的空間用于交換元素

  • 穩(wěn)定性:堆排序無(wú)法保證相等的元素的相對(duì)位置不變,因此它是不穩(wěn)定的排序算法

</article>

image

歡迎在留言區(qū)留下你的觀點(diǎn),一起討論提高。如果今天的文章讓你有新的啟發(fā),學(xué)習(xí)能力的提升上有新的認(rèn)識(shí),歡迎轉(zhuǎn)發(fā)分享給更多人。

歡迎各位讀者加入程序員小樂技術(shù)群,在公眾號(hào)后臺(tái)回復(fù)“加群”或者“學(xué)習(xí)”即可。

猜你還想看

阿里、騰訊、百度、華為、京東最新面試題匯集

Redis Sentinel 架構(gòu)原理詳解

Java 會(huì)走向晦暗嗎?Kotlin 會(huì)取而代之嗎

一次SQL優(yōu)化的體驗(yàn)

關(guān)注「程序員小樂」,收看更多精彩內(nèi)容

嘿,你在看嗎?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 又是美好的一天! 光是今天的名字,就花了我至少十秒鐘! 是啊,今天寫些什么呢?長(zhǎng)的太費(fèi)...
    鄭州___快樂閱讀 378評(píng)論 0 0
  • 愛上你只需一眼 忘記你卻耗盡一生 愛情里沒有公平和虧缺 只有誰(shuí)比誰(shuí)更賤 你不需要知道我還愛著你 因?yàn)檫@已經(jīng)與你毫無(wú)...
    東辰家紡工廠店閱讀 287評(píng)論 0 2
  • Introduce It's a weightless world where you can control t...
    zhengziyu閱讀 498評(píng)論 0 0
  • 當(dāng)了幾年老師,接觸了一批又一批家長(zhǎng),給我的感覺是:中產(chǎn)階級(jí)的家長(zhǎng)們都陷入瘋狂焦慮,無(wú)法自拔。 上家學(xué)校的學(xué)生來(lái)自外...
    花間青墨閱讀 161評(píng)論 0 1
  • 這是半生中我看到關(guān)于壓力的最好詮釋,沒有之一,那就是海明威的名言: 勇氣是優(yōu)雅地面對(duì)壓力。 還有一句,我經(jīng)常自我暗...
    銀城閱讀 2,633評(píng)論 41 63

友情鏈接更多精彩內(nèi)容