堆排序

目錄

  • 一、定義
  • 二、算法分析
  • 三、代碼地址

一、定義

1.1 堆

? 此處的堆,指數據結構中的堆。而不是內存中的那種內存堆,內存堆是基于數據結構的一種實現。堆的數據結構是一棵完全二叉樹,它有如下特點:(具體參考下文鏈接)

  • 堆是一棵完全二叉樹
  • 它總是最小值在根節點(或最大值在根節點)
  • 它上一層比下一層小(大)
  • 必定有快速刪除根節點,并返回根節點元素的方法
  • 在刪除根節點(最小元或者最大元)之后,自動調節使之依然保持堆結構。
  • 插入節點依然保持堆結構

? 綜上,堆結構的基本操作是插入刪除根節點,在操作過程中還會保持堆結構不會被破壞。所以我們可以用堆排序,我們可以通過刪除根節點得到最小值,再刪除根節點,得到第二小值,如此類推,只要一直取根節點,就能得到從小到大的序列。

堆的數據結構:https://www.cnblogs.com/dhcao/p/10591282.html

1.2 堆排序

? 對一個含有N個元素的數組a,我們利用堆排序的做法:

  • 首先建立一個二叉堆(最小元在根節點)。根據二叉堆的特性,此過程運行時間\(O(N)\)
  • 然后執行\(N\)次刪除最小元(deleteMin)操作,按照順序,最小的元素先離開堆。
  • 將這些元素記錄到第二個數組中,得到一個排序之后的數組(可避免使用第二個數組)。
  • 再將這些數組拷貝回來,得到\(N\)個元素的排序。

? 圖解
1328967-20190415223455461-2133887454.png

圖解描述

? 我們對數組a進行堆排序,采用根節點存放最大值(最大最小都一樣)并且避免使用第二個數組。

  • 構建一個Max堆,最大值在根節點,父節點必定比子節點大。
  • deleteMax,堆縮小1。
  • 將剛剛刪除的元素放在空出來的位置。
  • 依次類推,我們借助二叉堆一個重要的特性:刪除時,總是空出最后一個元素。這是為了保持它是一個完全二叉樹。
    1328967-20190415223515060-1656070338.png

以上做法,我們避免使用第二個數組,而是直接在第一個數組中構建一個堆。然后將堆排序!

二、算法分析

? 堆排序耗費的時間可以分為2個部分。第一階段構建堆,第二階段是循環刪除根元素(deleteMax)。

? 第一階段:從堆的性質我們可以知道,構建N個元素的堆,需要2N次比較。(這是因為堆的性質是父節點大于子節點,所以要選出父節點,需要根左右子節點相互比較)

? 第二階段:循環deleteMax。第\(i\)次deleteMax最多用到\(2\lfloor logi \rfloor\)次比較,這個時間來自于堆的deleteMax時間分析,刪除最大值之后,我們需要重新構建堆,那么就需要最后一個位置放入根節點所在的空穴(根節點作為最大值已經被刪除,只剩下空穴一個)中,然后采用下沉的方式,將它放到合適的位置,重新構建堆只需要滿足父節點大于子節點,所以下沉過程只需要根左子節點和右子節點比較,而二叉樹的高是\(logN\)

? 所以總時間是:
\[ 第二階段+第一階段時間 \\ 2(\sum_{i=1}^{N}logi )+2N\\ =2(log1+log2+···+logN)+2N\\ =2(log(1*2*3*···*N))+2N\\ =2(logN!)+2N\\ =2(log(\sqrt{2\pi N}\frac{N^N}{e^N})+2N\\ =2(\frac{1}{2}log(2\pi)+\frac{1}{2}logN + NlogN -Nloge)+2N \\ =O(2NlogN-O(N)) \]

關于堆的構建和刪除可以參照:https://www.cnblogs.com/dhcao/p/10591282.html

?

? 堆排序的時間是:\(O(2NlogN-O(N))\)

三、代碼地址

https://github.com/dhcao/dataStructuresAndAlgorithm/blob/master/src/chapterSeven/HeasportEx.java

轉載于:https://www.cnblogs.com/dhcao/p/10713840.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277931.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Teams Bot開發系列:Middleware

middleware是目前一些framework比較流行的概念,通常一個開發框架需要提供一些可擴展可定制化的功能。所以middleware這種pattern就很實用。 熟悉asp.net core的開發可能第一個想到的就是asp.net core的middleware,如下圖: 當一個http reques…

如何獲取租戶中所有的Team

大家在使用Graph API開發Teams App的時候,有時候會需要獲取某個租戶Tenant的所有team,在寫這篇文章的時候Graph API并沒有提供這么一個功能,沒有一個類似于”GET /teams”的api。 在Micorsoft Graph官方文檔的已知問題中,也提到了…

mysql常用快速查詢修改操作

mysql常用快速查詢修改操作 一、查找并修改非innodb引擎為innodb引擎 # 通用操作 mysql> select concat(alter table ,table_schema,.,table_name, engineinnodb;) from information_schema.tables where table_schema not in (information_schema,mysql,performance_schem…

ElasticSearch教程——自定義分詞器(轉學習使用)

一、分詞器 Elasticsearch中,內置了很多分詞器(analyzers),例如standard(標準分詞器)、english(英文分詞)和chinese(中文分詞),默認是standard. s…

使用Azure Serverless來開發Teams App

Azure Function可以說比較早期的一個serverless服務,隨著這些年云服務的大行其道,Serverless在概念越來越火,什么叫serverless? Serverless computing (or serverless for short), is an execution model where the cloud provide…

Angular之RouterModule的forRoot與forChild

Angular 提供了一種方式來把服務提供商從模塊中分離出來,以便模塊既可以帶著 providers 被根模塊導入,也可以不帶 providers 被子模塊導入。 區別: forRoot creates a module that contains all the directives, the given routes, and the r…

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法 記錄工作中遇到的問題 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh  由于遠程機器或者重組或者更新了ssh server導致本地記錄的驗證信…

使用AzureFunction開發最簡單的Teams Outgoing Webhook

上篇文章講了teams app的serverless架構,這篇主要講如何真正使用Azure Function來開發一個最最簡單的Teams Outgoing Webhook。 我們先登入azure的portal,創建一個azure function。我這里創建了一個名字叫outgoing-webhook的azure function。完成后如下…

Java 基礎 之 標識符

www.verejava.com/?id1699254… /* 標識符的命名規則: 1. 是以字母,數字,下滑線_和美元符號$ 組成 2. 不能以數字開頭 3. 區分大小寫 4. 不能是java的保留關鍵字 5. 最好是見名思意 */ public class Identifier {public static void main(String[] args…

Ubuntu宿主機與VMware中其他系統虛擬機的互通

Ubuntu做宿主機,VMware中創建Windows10,并且通過三種模式實現兩系統互通,其實并非是件難事。在有線網卡未接網線的環境下,關閉兩系統防火墻,基本遵從下文便可實現。 轉載:https://note.youdao.com/ynotesha…

使用Azure輕松實現Teams App的全球合規性

我在之前的一篇博客里面講了合規性對于我們Teams app是非常重要的,因為office365平臺就是面向全世界用戶的,我們開發的teams app一旦發布后,立刻就會有各國各地區的用戶來進行安裝使用,所以符合用戶所在地區的要求是非常重要的。 …

【php復習之】php創建數組的幾種方式

1、array()函數 1.1無key值 $arrarray(1,2,3,4); 1.2鍵值對 $arrarray( name>myj,age>18,phone>1888888888);1.3空數組 $arrarray(); 2、compact()函數 compact函數可以把變量轉換為數組。 $a aaa;$b bbb;$c ccc;$arr3 compact(a,b,c);輸出:{"a&q…

ADC知識(2)——直流參數(輸入電壓參考,參考電流輸入,積分非線性誤差,差分非線性誤差)...

目錄 四、 輸入參考電壓范圍 五、 參考電流 六、 非線性問題 差分非線性誤差 積分非線性 四、 輸入參考電壓范圍 大多數數據手冊中,將它定義為一個特定的參考電壓值,通常這個電壓作為 此轉換器最常用的參考電壓。在參考輸入電壓…

LuckyDraw app使用CosmosDB的成本分析

我在以前的博客里說過我的LuckyDraw app在數據存儲方面使用的是 Azure Table Storage,當時選擇這個的原因是成本考慮,因為它實在是便宜,對于我這種個人開發維護的免費的teams app來說,成本是一個很重要的考量點。 當然&#xff0…

React 重溫之 組件生命周期

生命周期 任何事物都不會憑空產生,也不會無故消亡。一個事物從產生到消亡經理的各個階段,我們稱之為 生命周期。 具體到我們的前端組件上來,一個組件的生命周期可以大體分為創建、更新、銷毀這個三個階段。 本文主要介紹React 的組件生命周期…

遷移聊天記錄到Teams

有一些朋友問我teams是否支持將其他平臺/系統里的聊天記錄遷移某個channel里,答案是肯定的,teams團隊在去年年中的時候就提供了這個功能。這個功能是通過graph api來完成的,我們今天就來看看如何遷移聊天記錄到teams里。 首先,我…

leetcode-191-Number of 1 Bits

題目描述: Write a function that takes an unsigned integer and returns the number of 1 bits it has (also known as the Hamming weight). Example 1: Input: 11 Output: 3 Explanation: Integer 11 has binary representation 000000000000000000000000000010…

androidsdk里的android.bat和uiautomatorview.bat啟動就閃退問題

進入D:\androidsdk\tools文件夾: 使用編輯文件工具: rem Check we have a valid Java.exe in the path.set java_execall lib\find_java.bat 替換成下列代碼: rem Check we have a valid Java.exe in the path.set java_exeC:\Program Files\…

10 個優質的 Laravel 擴展推薦

這里有 10 個用來搭建 Laravel 應用的包 為何會創建這個包的列表?因為我是一個「比較懶」的開發者,在臉書上是多個 Laravel 小組的成員。平日遇到最多的問題就是開發是需要用那些包。我很懶所以我不想每次都從頭開始搞這些東東。 為何此文沒有包括管理包…

Teams AppId, InstallationId 和 ExternalId 的區別

大家如果看teams的 graph api 開發文檔,可能會把 app id, installation id 和 external id 搞混,我自己一開始的時候就有點被搞暈了,再加上app manifest里面的 id 和 bot id,基本就徹底暈掉了。 那我們今天這篇文章就來講講這幾種…