最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java詳細(xì)講解堆排序與時(shí)間復(fù)雜度的概念

 更新時(shí)間:2022年04月26日 11:20:53   作者:淡沫初夏Zz  
本文主要介紹了java實(shí)現(xiàn)堆排序以及時(shí)間復(fù)雜度,堆排序這種排序算法是我們經(jīng)常用到的,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、堆排序

1、什么是堆排序

(1)堆排序:堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。

(2)堆是具有以下性質(zhì)的完全二叉樹:每個(gè)結(jié)點(diǎn)的值都大于或等于其左右孩子結(jié)點(diǎn)的值,稱為大頂堆;或者每個(gè)結(jié)點(diǎn)的值都小于或等于其左右孩子結(jié)點(diǎn)的值,稱為小頂堆。

2、堆排序思想

(1)將無需序列構(gòu)建成一個(gè)堆,根據(jù)升序降序需求選擇大頂堆或小頂堆

(2)將堆頂元素與末尾元素交換,將最大元素"沉"到數(shù)組末端

(3)重新調(diào)整結(jié)構(gòu),使其滿足堆定義,然后繼續(xù)交換堆頂元素與當(dāng)前末尾元素,反復(fù)執(zhí)行調(diào)整+交換步驟,直到整個(gè)序列有序

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

import java.util.Arrays;
public class Sort {
     //將任意數(shù)組進(jìn)行原地堆排序
    public static void heapSort(int[] arr) {
        //把數(shù)組調(diào)整為最大堆,從最后一個(gè)非葉子節(jié)點(diǎn)開始下沉
        for (int i = (arr.length-1-1)/2; i >= 0; i--) {
            siftDown(arr,i,arr.length);
        }
        //將堆頂元素和最后一個(gè)元素交換
        for (int i = arr.length-1; i > 0 ; i--) {
            swap(arr,0,i);
            siftDown(arr,0,i);
        }
    }
   //下沉操作
    private static void siftDown(int[] arr, int i, int n) {
        while ((2 * i)+1 < n){
            int j = (2 * i) + 1;
            if(j+1<n && arr[j+1]>arr[j]){
               j = j+1;
            }
            if(arr[i] >= arr[j]){
                break;
            }else{
                swap(arr,i,j);
                i = j;
            }
        }
    }
     public static void main(String []args){
        int []arr = {7,6,7,11,5,12,3,0,1};
        System.out.println("排序前:"+ Arrays.toString(arr));
        heapSort(arr);
        System.out.println("排序后:"+Arrays.toString(arr));
    }
}

運(yùn)行截圖:

二、時(shí)間復(fù)雜度分析

1、初始化建堆

初始化建堆只需要對(duì)二叉樹的非葉子節(jié)點(diǎn)由下至上,由右至左選取非葉子節(jié)點(diǎn)來調(diào)用adjusthead()函數(shù)。那么倒數(shù)第二層的最右邊的非葉子節(jié)點(diǎn)就是最后一個(gè)非葉子結(jié)點(diǎn)。

 假設(shè)高度為k,則從倒數(shù)第二層右邊的節(jié)點(diǎn)開始,這一層的節(jié)點(diǎn)都要執(zhí)行子節(jié)點(diǎn)比較然后交換;倒數(shù)第三層呢,則會(huì)選擇其子節(jié)點(diǎn)進(jìn)行比較和交換,如果沒交換就可以不用再執(zhí)行下去了。高層也是這樣逐漸遞歸。

 那么總的時(shí)間計(jì)算為:s = 2^( i - 1 ) * ( k - i );其中 i 表示第幾層,2^( i - 1) 表示該層上有多少個(gè)元素,( k - i) 表示子樹上要下調(diào)比較的次數(shù)。

S = n - log(n) -1,所以時(shí)間復(fù)雜度為:O(n)

2、排序重建堆

每次重建意味著有一個(gè)節(jié)點(diǎn)出堆,所以需要將堆的容量減一。adjustheap()函數(shù)的時(shí)間復(fù)雜度k=log(n),k為堆的層數(shù)。所以在每次重建時(shí),隨著堆的容量的減小,層數(shù)會(huì)下降,函數(shù)時(shí)間復(fù)雜度會(huì)變化。重建堆一共需要n-1次循環(huán),每次循環(huán)的比較次數(shù)為log(i),則相加為:log2+log3+…+log(n-1)+log(n)≈log(n!)。

所以時(shí)間復(fù)雜度為O(nlogn)

3、總結(jié)

初始化建堆的時(shí)間復(fù)雜度為O(n),排序重建堆的時(shí)間復(fù)雜度為nlog(n),所以總的時(shí)間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(1)。

到此這篇關(guān)于Java詳細(xì)講解堆排序與時(shí)間復(fù)雜度的概念的文章就介紹到這了,更多相關(guān)Java堆排序與時(shí)間復(fù)雜度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA中文亂碼的幾種常見解決方案

    IDEA中文亂碼的幾種常見解決方案

    IntelliJ IDEA 如果不進(jìn)行相關(guān)設(shè)置,可能會(huì)導(dǎo)致控制臺(tái)中文亂碼、配置文件中文亂碼等問題,非常影響編碼過程中進(jìn)行問題追蹤,所以本文給大家介紹了IDEA中文亂碼的幾種常見解決方案,需要的朋友可以參考下
    2025-04-04
  • java中synchronized關(guān)鍵字的3種寫法實(shí)例

    java中synchronized關(guān)鍵字的3種寫法實(shí)例

    synchronized是Java中的關(guān)鍵字,是一種同步鎖,下面這篇文章主要給大家介紹了關(guān)于java中synchronized關(guān)鍵字的3種寫法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • Java依賴倒轉(zhuǎn)原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java依賴倒轉(zhuǎn)原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java依賴倒轉(zhuǎn)原則的定義及問題由來解決方案,感興趣的朋友一起看看吧
    2017-08-08
  • Java中StringBuilder類的介紹與常用方法

    Java中StringBuilder類的介紹與常用方法

    StringBuilder是一個(gè)可變的字符串的操作類,我們可以把它看成是一個(gè)對(duì)象容器,下面這篇文章主要給大家介紹了關(guān)于Java中StringBuilder類的介紹與常用方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 淺析java中asList的使用詳解

    淺析java中asList的使用詳解

    Java中的asList方法是數(shù)組工具類 Arrays中的一個(gè)靜態(tài)方法,asList()方法把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法,本文通過示例代碼給大家介紹java asList使用,感興趣的朋友一起看看吧
    2021-10-10
  • spring cloud gateway如何獲取請(qǐng)求的真實(shí)地址

    spring cloud gateway如何獲取請(qǐng)求的真實(shí)地址

    這篇文章主要介紹了spring cloud gateway如何獲取請(qǐng)求的真實(shí)地址問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java二叉搜索樹遍歷操作詳解【前序、中序、后序、層次、廣度優(yōu)先遍歷】

    Java二叉搜索樹遍歷操作詳解【前序、中序、后序、層次、廣度優(yōu)先遍歷】

    這篇文章主要介紹了Java二叉搜索樹遍歷操作,結(jié)合實(shí)例形式詳細(xì)分析了Java二叉搜索樹前序、中序、后序、層次、廣度優(yōu)先遍歷等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2020-03-03
  • MyBatis基于pagehelper實(shí)現(xiàn)分頁原理及代碼實(shí)例

    MyBatis基于pagehelper實(shí)現(xiàn)分頁原理及代碼實(shí)例

    這篇文章主要介紹了MyBatis基于pagehelper實(shí)現(xiàn)分頁原理及代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java快速實(shí)現(xiàn)圖書管理基本功能

    Java快速實(shí)現(xiàn)圖書管理基本功能

    隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對(duì)圖書館的日常工作進(jìn)行管理勢(shì)在必行,本篇文章涵蓋一個(gè)圖書管理系統(tǒng)的基本功能實(shí)現(xiàn)代碼,大家可以查缺補(bǔ)漏,提升水平
    2022-05-05
  • Maven 倉庫國內(nèi)鏡像源收藏(小結(jié))

    Maven 倉庫國內(nèi)鏡像源收藏(小結(jié))

    這篇文章主要介紹了Maven 倉庫國內(nèi)鏡像源收藏(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論

青浦区| 灌云县| 元江| 开封市| 盐池县| 如东县| 南投市| 集安市| 澄江县| 麻栗坡县| 东台市| 大庆市| 江山市| 峨边| 宁明县| 新安县| 申扎县| 定安县| 鹿泉市| 天津市| 利川市| 平舆县| 苍梧县| 道孚县| 江华| 白山市| 榆社县| 定安县| 玉龙| 文山县| 广丰县| 嘉峪关市| 衢州市| 芒康县| 称多县| 乌兰县| 衡山县| 和林格尔县| 河北区| 雷州市| 新干县|