排序演算法-(7)堆排序

来源:https://www.cnblogs.com/wuguanglin/archive/2018/08/20/heapSort.html
-Advertisement-
Play Games

堆排序 堆排序是利用堆這種數據結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為O(nlogn),它也是不穩定排序。首先簡單瞭解下堆結構。 堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點 ...


堆排序

堆排序是利用這種數據結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為O(nlogn),它也是不穩定排序。首先簡單瞭解下堆結構。

堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖:

同時,我們對堆中的結點按層進行編號,將這種邏輯結構映射到數組中就是下麵這個樣子

該數組從邏輯上講就是一個堆結構,我們用簡單的公式來描述一下堆的定義就是:

大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]  

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]  

詳細步驟和原理可以看這篇:https://www.cnblogs.com/chengxiao/p/6129630.html

排序是一種選擇排序,整體主要由構建初始堆+交換堆頂元素和末尾元素並重建堆兩部分組成。其中構建初始堆經推導複雜度為O(n),在交換並重建堆的過程中,需交換n-1次,而重建堆的過程中,根據完全二叉樹的性質,[log2(n-1),log2(n-2)...1]逐步遞減,近似為nlogn。所以堆排序時間複雜度一般認為就是O(nlogn)級。 堆排序屬於選擇排序演算法,是不穩定

 

代碼實現

//重新調整為大頂堆
function _heapify(arr, size, index) {
    let largest = index;
    const left = 2 * index + 1;
    const right = 2 * index + 2;
    if (left < size && arr[left] > arr[largest]) {
        largest = left;
    }
    if (right < size && arr[right] > arr[largest]) {
        largest = right;
    }
    if (largest !== index) {
        [arr[index], arr[largest]] = [arr[largest], arr[index]];
        _heapify(arr, size, largest);
    }
}

//這裡的堆排序用的是最大堆
function heapSort(arr) {
    const result = arr.slice(0);
    const size = arr.length;
    for (let i = Math.floor(size / 2 - 1); i >= 0; i--) {
        _heapify(result, size, i);
    }
    for (let i = size - 1; i >= 0; i--) {
        [result[0], result[i]] = [result[i], result[0]];
        _heapify(result, i, 0);
    }
    return result;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近學習了 HTML5 中的重頭戲 。利用 canvas,前端人員可以很輕鬆地、進行圖像處理。其 API 繁多,這次主要學習常用的 API,並且完成以下兩個代碼: 1. 實現去色濾鏡 2. 實現負色(反色)濾鏡 歡迎入群:_857989948_ 。IT 技術深度交流和分享,涉及方麵包括但不限於:網站 ...
  • jQuery中常用的事件: blur:失去焦點 focus:獲取焦點 click:點擊事件 keydown:鍵盤按下的事件 keyup:鍵盤按下鬆開後的事件 mousemove:滑鼠移動事件 hover:滑鼠懸浮事件 mousedown:滑鼠按下發生的事件 mouseup:滑鼠按下鬆開發生的事件 . ...
  • 1、實現動態圖片的切換隻需要改變目標圖片的路徑 ...
  • FormData格式提交的post參數可以直接從req.body里取,而axios用request payload,req.body都是空對象。 百度一圈,全是你抄我我抄你,要麼讓你繞路用contentType+JSON.stringfy,要麼就res.on流讀取請求數據,一點都不優雅好麽。其實沒那 ...
  • 得益於 JavaScript 加入的 decorator 特性,可以使我們跟 Java/C 一樣,更加直觀自然的,做面向切麵編程。而隨著 TypeScript 的成熟,類型系統也讓我們增強了信心,面對複雜的業務邏輯,也更有底氣。 "egg controller" 是集合了一些在 Controller ...
  • 序言 這裡要講的就是一個Redux在React中的應用問題,講一講Redux,react redux,redux thunk,redux actions,redux promise,redux sage這些包的作用和他們解決的問題。 因為不想把篇幅拉得太長,所以沒有太多源碼分析和語法講解,能怎麼簡單 ...
  • 前幾天安卓真機測試的時候,突然發現一個嚴重的問題。 後退兩次退出應用,再開啟白屏。而殺掉進程後再開啟就是好的。 這個重大bug我跟了好久,以為是splash-screen的問題。 後來一點一點打console,才找出問題————redux在後退兩次退出時,未重置,而保留了退出前的狀態值。 我不知道為 ...
  • 萬惡的IE,option竟然不支持display樣式,想到的解決思路有二個: 1、ajax聯動查詢 2、jQuery的remove()、after()方法 方法1的不好之處是初始頁面,需要顯示全部IP,本來已經從後臺查詢了一次,如果再利用ajax,會給伺服器造成壓力,所以採用方法2。 後臺code ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...