国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

為什么堆排序的時間復(fù)雜度是O(N*logN)?

這篇具有很好參考價值的文章主要介紹了為什么堆排序的時間復(fù)雜度是O(N*logN)?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

前言:

堆排序(以排升序為例)

步驟(用大根堆,倒這排,排升序):

1.先把要排列的數(shù)組建立成大根堆

2.堆頂元素(82)和最后一個元素交換(2)

3.無視掉交換后的元素(82),對(2)進(jìn)行向下調(diào)整

翻譯成代碼

mian方法:

heapSortUp方法:

siftDown方法:

堆排序時間復(fù)雜度分析:


前言:

本文章以升序為例進(jìn)行講解(實際上兩種排列時間復(fù)雜度都一樣,只是比較方式建立大小堆恰好相反)

文章涉及:

1.向下調(diào)整算法

2.建堆的方式及其時間復(fù)雜度

3.堆排序步驟和時間復(fù)雜度分析

注意:如果1,2點還不了解,建議學(xué)習(xí)完之后在來學(xué)習(xí)堆排序,才能明白下邊講的是什么。

這里有小編自己寫的鏈接,詳細(xì)介紹了堆的創(chuàng)建以及向下/向上調(diào)整算法:優(yōu)先級隊列(堆)

堆排序(以排升序為例)

如果是排升序,要建立大根堆,反之亦然。

排降序,建立小堆

為什么?

看完他的原理,就知道了。


以數(shù)組array={

4,6, 82, 7, 8, 9, 3, 2

}

為例

步驟(用大根堆,倒這排,排升序):

1.先把要排列的數(shù)組建立成大根堆

為什么堆排序的時間復(fù)雜度是O(N*logN)?,數(shù)據(jù)結(jié)構(gòu)

2.堆頂元素(82)和最后一個元素交換(2)

為什么堆排序的時間復(fù)雜度是O(N*logN)?,數(shù)據(jù)結(jié)構(gòu)

3.無視掉交換后的元素(82),對(2)進(jìn)行向下調(diào)整

此時又變成了大根堆(無視已經(jīng)排好的82):

為什么堆排序的時間復(fù)雜度是O(N*logN)?,數(shù)據(jù)結(jié)構(gòu)

此時的82已經(jīng)被排號了

其是堆排序的整體思路已經(jīng)講完了,接下來就是循環(huán)執(zhí)行2,3點
3和9換位置,然后無視排好的82,9,對3進(jìn)行向下調(diào)整:

為什么堆排序的時間復(fù)雜度是O(N*logN)?,數(shù)據(jù)結(jié)構(gòu)

在向下調(diào)整完之后,又是一個大根堆,我們繼續(xù),循環(huán)這個邏輯,最終的結(jié)果就變成了:

為什么堆排序的時間復(fù)雜度是O(N*logN)?,數(shù)據(jù)結(jié)構(gòu)

這時,就是一個升序的數(shù)組了。

翻譯成代碼

mian方法:

public class Test {


    public static void main(String[] args) {

        int[] arr = new int[]{4,6, 82, 7, 8, 9, 3, 2};//要排的數(shù)組
        BigHeap bigHeap = new BigHeap();//這個是我自己寫的大根堆
        bigHeap.init(arr);//把數(shù)組傳入對象
        bigHeap.creatHeap();//先建立起大堆
        bigHeap.heapSortUp();//進(jìn)行堆排序


    }
}

heapSortUp方法:

1.我的堆,底層使用elem的數(shù)組實現(xiàn)的?。。。?!

2.useSize是堆的容量

3.swap的兩個參數(shù)都是數(shù)組的下標(biāo)

public int[] heapSortUp() {


        int endIndex = useSize - 1;//最后一個下標(biāo)的位置(也就是容量減1)
        while (endIndex > 0) {//如果等于零,就不用交換了
            swap(0, endIndex);//頂元素和最后一個元素交換
            endIndex--;//最后一個下標(biāo)--,就可以起到無視排號數(shù),的作用
            siftDown(0, endIndex);
        }
        return elem;
    }

siftDown方法:

public void siftDown(int parent, int end) {//parent end都是有效下標(biāo)

        int child = 2 * parent + 1;//默認(rèn)是左孩子
        while (child <= end) {//調(diào)整到最后一個子節(jié)點,為止
            //先判斷是否有右孩子
            if (child + 1 <= end) {//如果有判斷誰大,大的當(dāng)左孩子
                if (elem[child] < elem[child + 1]) {
                    child++;
                }
            }

            //左孩子在和父節(jié)點進(jìn)行比較
            if (elem[child] > elem[parent]) {//如果孩子節(jié)點大,那么父子交換位置
                swap(child, parent);
            } else {
                break;//如果父節(jié)點已經(jīng)是最大的就不用調(diào)整了,這棵樹就是大根堆
                //因為我們會從后往前,把這棵樹(數(shù)組)一次遍歷調(diào)整完
            }
            //下面繼續(xù)往往下面調(diào)整
            parent = child;//當(dāng)前的父親,變成自己的孩子
            child = parent * 2 + 1;//孩子變成孩子的孩子
        }
    }

堆排序時間復(fù)雜度分析:

其實很簡單,上面我們一共說了三個方法:

1.main

2.heapSortUp

3.siftDown

我們從main方法切入,實際上執(zhí)行堆排序的程序就是這兩步:

 public static void main(String[] args) {

        int[] arr = new int[]{4,6, 82, 7, 8, 9, 3, 2};
        BigHeap bigHeap = new BigHeap();
        bigHeap.init(arr);

//這兩步:
        bigHeap.creatHeap();//先創(chuàng)建大根堆
        bigHeap.heapSortUp();//堆排序,內(nèi)部實現(xiàn)等一下看


    }

學(xué)了堆我們都直到,建堆的時間復(fù)雜度是O(N)

然后在加上heapSortUp的時間復(fù)雜度,不就是堆排序的時間復(fù)雜度了嗎?

具體看一下,heapSortUp:

 public int[] heapSortUp() {


        int endIndex = useSize - 1;
        while (endIndex > 0) {
            swap(0, endIndex);
            endIndex--;
            siftDown(0, endIndex);
        }
        return elem;
    }

useSize和siftDown是我們要計算的時間復(fù)雜度,其他都是常量不用管

useSize實際上就是所給數(shù)組的長度嘛,就是N咯,

學(xué)了siftDown就是向下調(diào)整算法,向下調(diào)整算法向上調(diào)整算法的時間復(fù)雜度都是logN(以2為底)-----》至于怎么算的,可以看小編文章前言部分的鏈接

所以堆排序的時間復(fù)雜度==O(useSize)+O(siftDown)*O(creatHeap)=N+N*logN

然后取得最高階,則時間復(fù)雜度就是O(N*logN)文章來源地址http://www.zghlxwxcb.cn/news/detail-857270.html

到了這里,關(guān)于為什么堆排序的時間復(fù)雜度是O(N*logN)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 常見的排序算法的時間復(fù)雜度

    常見的排序算法的時間復(fù)雜度

    排序算法的時間復(fù)雜度通常取決于輸入數(shù)據(jù)的規(guī)模(通常表示為n)。以下是一些常見排序算法及其平均、最好和最壞情況下的時間復(fù)雜度: 1、冒泡排序(Bubble Sort) 平均時間復(fù)雜度:O(n^2) 最好情況時間復(fù)雜度:O(n) 最壞情況時間復(fù)雜度:O(n^2) 冒泡排序通過重復(fù)地遍歷待排序

    2024年04月13日
    瀏覽(23)
  • 希爾排序及其時間復(fù)雜度(圖文詳解)

    希爾排序及其時間復(fù)雜度(圖文詳解)

    ?? 博客主頁: 愛吃bug的猿 ?? 博客專欄: 數(shù)據(jù)結(jié)構(gòu),C語言初階進(jìn)階全流程講解 ?????? 如果喜歡博主的文章,可以給博主點波贊和關(guān)注加速博主更新 希爾排序里的一部分和插入排序極其相似,了解插入排序及其復(fù)雜度(動圖講解)可點擊此處 希爾排序分為兩部分:預(yù)排序

    2024年02月13日
    瀏覽(23)
  • 什么是時間復(fù)雜度和空間復(fù)雜度

    什么是時間復(fù)雜度和空間復(fù)雜度

    ??博客主頁:?自信不孤單 ??文章專欄:數(shù)據(jù)結(jié)構(gòu)與算法 ??代碼倉庫:破浪曉夢 ??歡迎關(guān)注:歡迎大家點贊收藏+關(guān)注 數(shù)據(jù)結(jié)構(gòu)(Data Structure)是計算機(jī)存儲、組織數(shù)據(jù)的方式,指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 算法(Algorithm):就是定義良好的計算過程

    2023年04月15日
    瀏覽(22)
  • 排序算法的時間復(fù)雜度存在下界問題

    排序算法的時間復(fù)雜度存在下界問題

    對于幾種常用的排序算法,無論是歸并排序、快速排序、以及更加常見的冒泡排序等,這些排序算法的時間復(fù)雜度都是大于等于O(n*lg(n))的,而這些排序算法存在一個共同的行為,那就是這些算法在對元素進(jìn)行排序的時候,都會進(jìn)行同一個操作,也就是對數(shù)組中取出文件,然后

    2024年02月21日
    瀏覽(23)
  • 常見的排序算法及時間空間復(fù)雜度

    常見的排序算法及時間空間復(fù)雜度

    排序算法是計算機(jī)科學(xué)中的基本算法之一,它用于將一組數(shù)據(jù)按照某種順序進(jìn)行排列。下面是一些常見的排序算法,以及它們的思想和時間空間復(fù)雜度,希望對大家有所幫助。北京木奇移動技術(shù)有限公司,專業(yè)的軟件外包開發(fā)公司,歡迎交流合作。 1. 冒泡排序 (Bubble Sort) - 思

    2024年02月07日
    瀏覽(20)
  • 快速排序算法詳解(原理,時間復(fù)雜度,實現(xiàn)代碼)

    快速排序算法詳解(原理,時間復(fù)雜度,實現(xiàn)代碼)

    快速排序算法詳解(原理、實現(xiàn)和時間復(fù)雜度) 快速排序是對冒泡排序的一種改進(jìn),由 C.A.R.Hoare(Charles Antony Richard Hoare,東尼·霍爾)在 1962 年提出。 快速排序的基本思想是 :通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)比另一部分的所有數(shù)據(jù)

    2024年02月13日
    瀏覽(19)
  • 時間復(fù)雜度為 O(n) 的排序算法

    時間復(fù)雜度為 O(n) 的排序算法

    大家好,我是 方圓 。本文介紹線性排序,即時間復(fù)雜度為 O(n) 的排序算法,包括桶排序,計數(shù)排序和基數(shù)排序,它們都不是基于比較的排序算法,大家重點關(guān)注一下這些算法的適用場景。 桶排序 桶排序是分治策略的一個典型應(yīng)用。它通過設(shè)置一些具有大小順序的桶,每個桶

    2024年02月21日
    瀏覽(22)
  • 時間復(fù)雜度為 O(nlogn) 的排序算法

    時間復(fù)雜度為 O(nlogn) 的排序算法

    歸并排序 歸并排序遵循 分治 的思想:將原問題分解為幾個規(guī)模較小但類似于原問題的子問題,遞歸地求解這些子問題,然后合并這些子問題的解來建立原問題的解,歸并排序的步驟如下: 劃分 :分解待排序的 n 個元素的序列成各具 n/2 個元素的兩個子序列,將長數(shù)組的排序

    2024年02月07日
    瀏覽(16)
  • 時間復(fù)雜度為 O(n^2) 的排序算法

    時間復(fù)雜度為 O(n^2) 的排序算法

    大家好,我是 方圓 。對于小規(guī)模數(shù)據(jù),我們可以選用時間復(fù)雜度為 O(n 2 ) 的排序算法,因為時間復(fù)雜度并不代表實際代碼的執(zhí)行時間,而且它也省去了低階、系數(shù)和常數(shù),僅代表的增長趨勢,所以在小規(guī)模數(shù)據(jù)情況下, O(n 2 ) 的排序算法可能會比 O(nlogn) 的排序算法執(zhí)行效率

    2024年02月07日
    瀏覽(24)
  • 時間復(fù)雜度接近O(n)的三種排序算法

    時間復(fù)雜度接近O(n)的三種排序算法

    桶排序,顧名思義,會用到“桶”,核心思想是將要排序的數(shù)據(jù)分到幾個有 序的桶里,每個桶內(nèi)的數(shù)據(jù)再單獨進(jìn)行排序。桶內(nèi)排完序之后,再把每個桶內(nèi)的數(shù)據(jù)按照順序依次 取出,組成的序列就是有序的了。 桶排序?qū)σ判驍?shù)據(jù)的要求是非常苛刻的。 首先,要排序的數(shù)據(jù)需

    2024年02月14日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包