欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java算法之歸并排序舉例詳解

 更新時間:2025年04月17日 09:38:15   作者:Brookty  
這篇文章主要介紹了Java算法之歸并排序的相關資料,歸并排序是一種遞歸排序算法,通過將數(shù)組分成更小的子數(shù)組,遞歸地排序這些子數(shù)組,然后將它們合并成有序數(shù)組,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、歸并排序的遞歸探尋

1.思路

理想結果等于成分解斷開子結果表達式的公式表示

快速排序:

整個數(shù)組有序 = 其中一個元素有序 + 其左斷開數(shù)組有序 + 其右斷開數(shù)組有序

歸并排序

整個數(shù)組有序 = 左斷開數(shù)組有序 + 右斷開數(shù)組有序 + 兩有序數(shù)組的有序合并

2.搭建

2.1設計過掉不符情況(在最底層時)

  • if(array == null) return, 數(shù)組沒有元素不用排,下面是有元素
  • if(left == right) return,只有一個元素已經(jīng)是有序了不用排,下面是多個元素
  • if(left > right) return,排不了不要排的,之后下面是符合一般情況的多個元素 

2.2查驗能實現(xiàn)基礎排序(在最底層往上點時)

在最底層往上點時,有序數(shù)組有序合并操作在最底層能實現(xiàn)兩元素之間的比較然后進行排序的

2.3跳轉結果繼續(xù)往上回搭:

跳轉有序數(shù)組結果繼續(xù)往上有序合并維護回搭

3.實質

從底層的最小單個斷開有序數(shù)組往上有序地合并成越來越大的斷開有序數(shù)組直至合并完成一個整體的有序數(shù)組

4.實現(xiàn)

    public static void mergeSort(int[] array) {
        mergeSortFunc(array,0,array.length-1);
    }

    private static void mergeSortFunc(int[] array,int left,int right) {
        if(left >= right) return;
        int mid = (left+right) / 2;

        mergeSortFunc(array,left,mid);
        mergeSortFunc(array,mid+1,right);
        merge(array,left,right,mid);
    }

    private static void merge(int[] array, int left, int right, int mid) {
        int s1 = left;
        int s2 = mid+1;
        int[] tmpArr = new int[right-left+1];
        int k = 0;
        //證明兩個區(qū)間 都同時有數(shù)據(jù)的
        while (s1 <= mid && s2 <= right) {
            if(array[s2] <= array[s1]) {
                tmpArr[k++] = array[s2++];
            }else {
                tmpArr[k++] = array[s1++];
            }
        }
        while (s1 <= mid) {
            tmpArr[k++] = array[s1++];
        }
        while (s2 <= right) {
            tmpArr[k++] = array[s2++];
        }
        //tmpArr 里面一定是這個區(qū)間內有序的數(shù)據(jù)了
        for (int i = 0; i < tmpArr.length; i++) {
            array[i+left] = tmpArr[i];
        }
    }

二、遞歸的調用棧

1.遞歸的執(zhí)行過程

在函數(shù)遞歸中,調用的函數(shù)里面執(zhí)行著再調用著隨著形參深入的不斷變化的函數(shù)自己

第一次調用函數(shù)的執(zhí)行轉去等著第二次調用函數(shù)的執(zhí)行完,第二次調用函數(shù)的執(zhí)行也卡著轉去等第三次調用函數(shù)的執(zhí)行完,一層層形參變化著重復地執(zhí)行調用而都沒有往下去return直到最后調用函數(shù)傳的形參變化到符合return的條件不再繼續(xù)往下調用了,return出結果開始往回地一層層促進上一層沒有執(zhí)行完到執(zhí)行完return,即開始往回地執(zhí)行往回地歸

2.遞歸的函數(shù)棧幀

所有任意一個函數(shù)的調用都會獨立開辟新的函數(shù)棧幀(里面存放局部變量、函數(shù)形參、返回地址、寄存器值)壓入調用棧中,在函數(shù)執(zhí)行到return語句結束后才彈出棧

遞歸調用時,函數(shù)棧幀從先往后地一個個獨立地壓入棧中,往下遞歸直到形參條件變到return由最新函數(shù)調用的棧幀開始往上彈棧幀出調用棧,在開始往上彈出棧幀開始有執(zhí)行完往回層往下執(zhí)行時,方法里面有可能寫的是繼續(xù)又去執(zhí)行調用當前層形參條件下的再來一波函數(shù)遞歸調用(形參變化可能就去設置成不同的了就會是左右不一樣的分支),即是二叉即二叉樹的情況:

  • 每一層不僅要左邊往下全執(zhí)行到底層然后開始往上全執(zhí)行到它那層的左邊結束,接著又要執(zhí)行右邊的往下執(zhí)行到底層然后再往上全執(zhí)行完到它的右層結束,最后它這個節(jié)點對應的這層函數(shù)才也執(zhí)行完它的棧幀也彈出調用棧,二叉樹從大到小所有的結構都是左邊往下全執(zhí)行完往上回來、右邊往下全執(zhí)行完往上回來、接著它這個節(jié)點的棧幀也往上彈返回執(zhí)行完 

2.1遞歸函數(shù)的棧幀壓彈

在歸并排序的二叉樹遞歸調用過程中:

  • 每次累計著往下調用到底層時,此時的調用棧所占的空間是最大的、深度在二叉樹的最底層,調用棧的空間計算為調用棧里棧幀的個數(shù)×每個棧幀的內存大小,在每個函數(shù)的棧幀中,函數(shù)里面那些函數(shù)的調用信息、并非循環(huán)出現(xiàn)的常量個數(shù)的局部變量空間和都可算成常數(shù)的大小,所以在歸并排序這里,調用棧的最大空間為在調用棧里棧幀個數(shù)最多的時候:樹的高度log(n)*每個函數(shù)棧幀的內存大小是常數(shù),即log(n)*常數(shù),函數(shù)調用執(zhí)行完最底層后就開始有往上返回了,往上彈出最新最頂?shù)臈?/strong>
  • 然后執(zhí)行完返回到上層時又回到當前層條件下的且新的形參變化模式的再往下遞歸,又會去壓棧到最底層,此時調用棧的空間又達到最大的log(n)
  • 當它右邊往下的也全執(zhí)行完又往上返回到當前層時,就開始繼續(xù)往下接著執(zhí)行就開始有去調用合并有序數(shù)組的函數(shù)了

2.2合并有序數(shù)組函數(shù)的棧幀壓彈

執(zhí)行調用合并有序數(shù)列的函數(shù)時,調用棧又會壓入合并有序數(shù)組函數(shù)的棧幀,里面存放有開辟的當前層數(shù)組元素個數(shù)大小的數(shù)組(非常量級的,要算的),此時總的占用空間為調用棧的空間log(n-...)+n(-...),因為合并有序數(shù)組函數(shù)的棧幀每次都是處在棧頂壓入的且函數(shù)里面并沒有再調用函數(shù)的在它之上再壓棧,所以它每次在棧頂進來壓棧完就緊接著彈出棧的

三、歸并排序的復雜度

1.空間復雜度

空間復雜度計算的是整個執(zhí)行所有時刻中出現(xiàn)的最大瞬時占用空間

從下層往上層的返回的過程中,遞歸函數(shù)的調用??臻g變小著、合并有序數(shù)組的函數(shù)棧幀在變大著(里面的數(shù)組越來越大的):

  • 最底層時占用的空間為遞歸函數(shù)的調用??臻glog(n)+合并有序數(shù)組的函數(shù)棧幀0,即log(n)+0=log(n)
  • 當?shù)竭_最上層第一層時,遞歸函數(shù)的調用??臻g是1,而合并有序數(shù)組的函數(shù)棧幀空間是n,此時的總空間大小是n,相比于最底層的log(n)及從下往上的過程中l(wèi)og(n)的遞減、n的遞增的總空間,此時的n是整個執(zhí)行所有時刻中出現(xiàn)的最大瞬時占用的空間,所以歸并排序的空間復雜度是O(n)

2.時間復雜度

時間復雜度即算整個遞歸調用執(zhí)行過程的時間和,我們可以不用按著遞歸搜索的過程去時時累計總的算,直接站在總二叉樹的角度一層一層地算所有時間的和就行了,一層層里面每一個樹節(jié)點及下的全執(zhí)行完對應著該調用函數(shù)的全執(zhí)行完,因為遞歸調用語句mergeSortFunc(array,left,mid)都是且已轉成里面的函數(shù)節(jié)點內容來算了(調用中的去執(zhí)行調用部分是常量級的已不算),且if(left >= right) return、int mid = (left+right) / 2也都是常量級的執(zhí)行時間不算,對應到總的時間就是計算所有函數(shù)節(jié)點里的merge(array,left,right,mid)合并有序數(shù)組的時間和,每一層所有函數(shù)節(jié)點的合并有序數(shù)組時間和都為n(除了最后一層的函數(shù)節(jié)點進去就直接判斷為return沒執(zhí)行有序數(shù)組合并),一共有l(wèi)og(n)層,所以時間復雜度為O(n*log(n)) 

總結

到此這篇關于Java算法之歸并排序的文章就介紹到這了,更多相關Java算法歸并排序內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java線程重復執(zhí)行以及操作共享變量的代碼示例

    Java線程重復執(zhí)行以及操作共享變量的代碼示例

    這篇文章主要介紹了Java中對線程重復執(zhí)行以及操作共享變量的代碼示例,來自于Java面試題目的練習整理,需要的朋友可以參考下
    2015-12-12
  • 建議你使用LocalDateTime而不是Date哦

    建議你使用LocalDateTime而不是Date哦

    這篇文章主要介紹了建議你使用LocalDateTime而不是Date,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • java實現(xiàn)學生宿舍系統(tǒng)

    java實現(xiàn)學生宿舍系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)學生宿舍系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java導出Excel文件的步驟全紀錄

    java導出Excel文件的步驟全紀錄

    這篇文章主要給大家介紹了關于java導出Excel文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • java愛心代碼完整示例(脫單必備)

    java愛心代碼完整示例(脫單必備)

    最近看到個好玩的,就是用代碼實現(xiàn)愛心的形狀,對于不懂編程的人來說,這是一個很好的玩的東西,這篇文章主要給大家介紹了關于java愛心代碼的相關資料,需要的朋友可以參考下
    2023-07-07
  • Spring Boot 3.x 全新的熱部署配置方式詳解(IntelliJ IDEA 2023.1)

    Spring Boot 3.x 全新的熱部署配置方式詳解(IntelliJ ID

    這篇文章主要介紹了Spring Boot 3.x 全新的熱部署配置方式(IntelliJ IDEA 2023.1),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 詳解如何在Java中創(chuàng)建Excel迷你圖

    詳解如何在Java中創(chuàng)建Excel迷你圖

    迷你圖是一種簡潔而有效的數(shù)據(jù)可視化方式,常用于展示趨勢和變化,通常被用于數(shù)據(jù)儀表盤、報告和展示中,以便在有限的空間內展示多個數(shù)據(jù)集的趨勢,今天小編為大家介紹如何在Java中創(chuàng)建Excel迷你圖,需要的朋友可以參考下
    2023-10-10
  • java web個人通訊錄系統(tǒng)設計

    java web個人通訊錄系統(tǒng)設計

    這篇文章主要為大家詳細介紹了java web個人通訊錄系統(tǒng)設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java 高并發(fā)三:Java內存模型和線程安全詳解

    Java 高并發(fā)三:Java內存模型和線程安全詳解

    本文主要介紹Java高并發(fā)內存模型和線程安全的資料,這里整理詳細的資料及1.原子性 2.有序性 3.可見性 4.Happen-Before 5.線程安全的概念,有需要的小伙伴可以參考下
    2016-09-09
  • MyBatis中關于resultType和resultMap的區(qū)別介紹

    MyBatis中關于resultType和resultMap的區(qū)別介紹

    MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap,那么MyBatis中關于resultType和resultMap的區(qū)別是什么呢?下面小編通過本文給大家解答下
    2016-09-09

最新評論