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

java中歸并排序和Master公式詳解

 更新時間:2022年01月07日 09:58:22   作者:吃魚的宗介  
大家好,本篇文章主要講的是java中歸并排序和Master公式詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

基本思想

歸并排序采取分治的思想進(jìn)行排序,借用一張圖片說明一下

在這里插入圖片描述

將n個元素從中間切開,分成兩部分。(左邊可能比右邊多1個數(shù)) 將步驟1分成的兩部分,再分別進(jìn)行遞歸分解。直到所有部分的元素個數(shù)都為1。 從最底層開始逐步合并兩個排好序的數(shù)列。
優(yōu)點在于,分治之后,合并排序的過程時間復(fù)雜度是O(N)(只需要掃描一遍就可以將兩個有序的數(shù)組合并成一個有序數(shù)組)

實現(xiàn)

  public static void MergeSort(int[] arr,int l , int r) {
        if (l == r || r < 0){
            return;
        }
        int middle = l+(r-l)/2; //取中值,可以防止達(dá)到Integer.MaxValue 溢出
        MergeSort(arr,l,middle);
        MergeSort(arr,middle+1,r);
        sort(arr,l,middle,r);
    }
    /**
     *
     * @param arr 等待排序的數(shù)組
     * @param l 左數(shù)組第一個指針
     * @param middle 分割左右數(shù)組
     * @param r 右數(shù)組最后一個指針
     */
    private static void sort(int[] arr, int l, int middle, int r) {
        int[] temp = new int[arr.length];
        System.arraycopy(arr, 0, temp, 0, arr.length);
        int right_first = middle+1;
        int tempIndex = l;
        while (l <= middle && right_first <= r){
            if (temp[tempIndex] < temp[right_first]){
                arr[l++] = temp[tempIndex++];
            }else {
                arr[l++] = temp[right_first++];
            }
        }
        while (tempIndex <= middle){
            arr[l++] = temp[tempIndex++];
        }
        while (right_first <= r ){
            arr[l++] = temp[right_first++];
        }

    }

對數(shù)器驗證

我們可以寫個對數(shù)器,使用暴力排序的方式驗證我們的排序方法是否準(zhǔn)確

   //生成1-100內(nèi)隨機(jī)數(shù)組
   public static int[] getParamArrays(){
        int[] result = new int[(int) (Math.random() * 100)];
        //隨機(jī)生成數(shù)
        for (int i = 0; i < result.length; i++) {
            result[i] = (int) (Math.random() * 100);
        }
        return result;
    }
    public static void main(String[] args){
        for (int i = 0; i < 1000000; i++) {
            int[] nums = getParamArrays();
            int[] temp = nums;
            MergeSort(nums,0,nums.length-1);
            Arrays.sort(temp);
            //通過自定義比較次數(shù),對隨機(jī)數(shù)組進(jìn)行排序驗證正確性
            if (!nums.equals(temp)){
                System.out.println("wrong");
            }
        }
        System.out.println("end");
    }

遞歸時間復(fù)雜度計算 Master 公式

形如
T(N) = a * T(N/b) + O(N^d)(其中的a、b、d都是常數(shù))
的遞歸函數(shù),可以直接通過Master公式來確定時間復(fù)雜度
如果 log(b,a) < d,復(fù)雜度為O(N^d)
如果 log(b,a) > d,復(fù)雜度為O(N^log(b,a))
如果 log(b,a) == d,復(fù)雜度為O(N^d * logN)
此公式適用于子遞歸規(guī)模相等的情況下

a表示遞歸的次數(shù)也就是生成的子問題數(shù),b表示每次遞歸是原來的1/b之一個規(guī)模,O(N^d) 表示分解和合并所要花費的時間之和(除開遞歸的復(fù)雜度)
此處就是 T(N)= 2*T(N/2)+O(N^1) 適用于第三種情況 復(fù)雜度為 O(nlogn)

總結(jié)

到此這篇關(guān)于java中歸并排序和Master公式詳解的文章就介紹到這了,更多相關(guān)java歸并排序和Master公式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?嵌入數(shù)據(jù)引擎從?SQLite?到?SPL詳解

    Java?嵌入數(shù)據(jù)引擎從?SQLite?到?SPL詳解

    這篇文章主要介紹了Java?嵌入數(shù)據(jù)引擎:從?SQLite?到?SPL,SQLite架構(gòu)簡單,其核心雖然是C語言開發(fā)的,但封裝得比較好,對外呈現(xiàn)為一個小巧的Jar包,能方便地集成在Java應(yīng)用中,本文給大家介紹的非常詳細(xì),需要的朋友參考下
    2022-07-07
  • Hibernate延遲加載技術(shù)詳解

    Hibernate延遲加載技術(shù)詳解

    這篇文章主要介紹了Hibernate延遲加載技術(shù),結(jié)合實例形式詳細(xì)分析了Hibernate延遲加載所涉及的各種常用技巧,需要的朋友可以參考下
    2016-03-03
  • 詳解springboot項目docker部署實踐

    詳解springboot項目docker部署實踐

    這篇文章主要介紹了詳解springboot項目docker部署實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 詳解Redis 緩存 + Spring 的集成示例

    詳解Redis 緩存 + Spring 的集成示例

    本篇文章主要介紹了Redis 緩存 + Spring 的集成示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • java 出現(xiàn)Zipexception 異常的解決辦法

    java 出現(xiàn)Zipexception 異常的解決辦法

    這篇文章主要介紹了java 出現(xiàn)Zipexception 異常的解決辦法的相關(guān)資料,出現(xiàn) java.util.zip.ZipException: error in opening zip file 異常的原因及解決方法,需要的朋友可以參考下
    2017-08-08
  • MyBatis 實現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例

    MyBatis 實現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例

    這篇文章主要介紹了MyBatis 實現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java classloader和namespace詳細(xì)介紹

    Java classloader和namespace詳細(xì)介紹

    這篇文章主要介紹了Java classloader和namespace詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • MyEclipse2017創(chuàng)建Spring項目的方法

    MyEclipse2017創(chuàng)建Spring項目的方法

    這篇文章主要為大家詳細(xì)介紹了MyEclipse2017創(chuàng)建Spring項目的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java數(shù)據(jù)結(jié)構(gòu)-堆實現(xiàn)優(yōu)先隊列

    java數(shù)據(jù)結(jié)構(gòu)-堆實現(xiàn)優(yōu)先隊列

    通常都把隊列比喻成排隊買東西,大家都很守秩序,先排隊的人就先買東西。但是優(yōu)先隊列有所不同,它不遵循先進(jìn)先出的規(guī)則,而是根據(jù)隊列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)-堆實現(xiàn)優(yōu)先隊列,感興趣的朋友一起看看吧
    2021-08-08
  • shiro 認(rèn)證流程操作

    shiro 認(rèn)證流程操作

    這篇文章主要介紹了shiro 認(rèn)證操作的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-01-01

最新評論