亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java詳細講解堆排序與時間復雜度的概念

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

一、堆排序

1、什么是堆排序

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

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

2、堆排序思想

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

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

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

3、代碼實現(xiàn)

import java.util.Arrays;
public class Sort {
     //將任意數(shù)組進行原地堆排序
    public static void heapSort(int[] arr) {
        //把數(shù)組調(diào)整為最大堆,從最后一個非葉子節(jié)點開始下沉
        for (int i = (arr.length-1-1)/2; i >= 0; i--) {
            siftDown(arr,i,arr.length);
        }
        //將堆頂元素和最后一個元素交換
        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));
    }
}

運行截圖:

二、時間復雜度分析

1、初始化建堆

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

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

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

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

2、排序重建堆

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

所以時間復雜度為O(nlogn)

3、總結(jié)

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

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

相關(guān)文章

  • Java多例Bean的應用場景-easyExcel導入

    Java多例Bean的應用場景-easyExcel導入

    EasyExcel 是一個基于 Java 的簡單、省內(nèi)存的讀寫 Excel 的開源項目。這篇文章主要介紹了用easyExcel導入Java Bean的應用場景,感興趣的朋友可以參考閱讀
    2023-04-04
  • Java 爬蟲服務器被屏蔽的解決方案

    Java 爬蟲服務器被屏蔽的解決方案

    這篇文章主要介紹了Java 爬蟲服務器被屏蔽的解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java 如何實現(xiàn)解壓縮文件和文件夾

    Java 如何實現(xiàn)解壓縮文件和文件夾

    這篇文章主要介紹了Java 如何實現(xiàn)解壓縮文件和文件夾,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 詳解Java中clone的寫法

    詳解Java中clone的寫法

    這篇文章主要介紹了Java中clone的寫法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Java中ArrayList的removeAll方法詳解

    Java中ArrayList的removeAll方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中ArrayList的removeAll方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來看看吧。
    2017-07-07
  • Java設計模式七大原則之單一職責原則詳解

    Java設計模式七大原則之單一職責原則詳解

    單一職責原則(Single Responsibility Principle, SRP),有且僅有一個原因引起類的變更。簡單來說,就是針對一個java類,它應該只負責一項職責。本文將詳細介紹一下Java設計模式七大原則之一的單一職責原則,需要的可以參考一下
    2022-02-02
  • Java中的接口回調(diào)實例

    Java中的接口回調(diào)實例

    今天小編就為大家分享一篇關(guān)于Java中的接口回調(diào)實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法

    啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法

    這篇文章主要介紹了啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法,也就是使用默認用戶和密碼登錄的操作方法,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • mybatis-plus分頁查詢的實現(xiàn)示例

    mybatis-plus分頁查詢的實現(xiàn)示例

    這篇文章主要介紹了mybatis-plus分頁查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • springboot 返回json格式數(shù)據(jù)時間格式配置方式

    springboot 返回json格式數(shù)據(jù)時間格式配置方式

    這篇文章主要介紹了springboot 返回json格式數(shù)據(jù)時間格式配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論