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

JAVA十大排序算法之歸并排序詳解

 更新時間:2021年08月23日 09:56:43   作者:阿粵Ayue  
這篇文章主要介紹了java中的歸并排序,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

歸并排序

歸并,指合并,合在一起。歸并排序(Merge Sort)是建立在歸并操作上的一種排序算法。其主要思想是分而治之。什么是分而治之?分而治之就是將一個復(fù)雜的計算,按照設(shè)定的閾值進行分解成多個計算,然后將各個計算結(jié)果進行匯總。即“分”就是把一個大的通過遞歸拆成若干個小的,“治”就是將分后的結(jié)果在合在一起。

若將兩個有序集合并成一個有序表,稱為2-路歸并,與之對應(yīng)的還有多路歸并。

image-20210730115340519

怎么分

  • 對于排序最好的情況來講,就是只有兩個元素,這時候比較大小就很簡單,但是還是需要比較
  • 如果拆分為左右各一個,無需比較即是有序的。

怎么治

借助一個輔助空數(shù)組,把左右兩邊的數(shù)組按照大小比較,按順序放入輔助數(shù)組中即可。

以下面兩個有序數(shù)組為例:

歸并排序

代碼實現(xiàn)

public class MergeSort {
    public static final int[] ARRAY = {8, 5, 6, 4, 3, 1, 7, 2};
    public static int[] sort(int[] array) {
        if (array.length < 2) return array;
        int mid = array.length / 2;
        //分成2組
        int[] left = Arrays.copyOfRange(array, 0, mid);
        int[] right = Arrays.copyOfRange(array, mid, array.length);
        //遞歸拆分
        return merge(sort(left), sort(right));
    }
    //治---合并
    public static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        //i代表左邊數(shù)組的索引,j代表右邊
        for (int index = 0, i = 0, j = 0; index < result.length; index++) {
            if (i >= left.length) {//說明左側(cè)的數(shù)據(jù)已經(jīng)全部取完,取右邊的數(shù)據(jù)
                result[index] = right[j++];
            } else if (j >= right.length) {//說明右側(cè)的數(shù)據(jù)已經(jīng)全部取完,取左邊的數(shù)據(jù)
                result[index] = left[i++];
            } else if (left[i] > right[j]) {//左邊大于右邊,取右邊的
                int a = right[j++];
                result[index] = a;
            } else {//右邊大于左邊,取左邊的
                result[index] = left[i++];
            }
        }
        return result;
    }
    public static void print(int[] array) {
        for (int i : array) {
            System.out.print(i + "  ");
        }
        System.out.println("");
    }
    public static void main(String[] args) {
        print(ARRAY);
        System.out.println("============================================");
        print(sort(ARRAY));
    }
}

時間復(fù)雜度

歸并排序方法就是把一組n個數(shù)的序列,折半分為兩個序列,然后再將這兩個序列再分,一直分下去,直到分為n個長度為1的序列。然后兩兩按大小歸并。如此反復(fù),直到最后形成包含n個數(shù)的一個數(shù)組。

歸并排序總時間 = 分解時間 + 子序列排好序時間 + 合并時間

無論每個序列有多少數(shù)都是折中分解,所以分解時間是個常數(shù),可以忽略不計,則:

歸并排序總時間 = 子序列排好序時間 + 合并時間

假設(shè)處理的數(shù)據(jù)規(guī)模大小為 n,運行時間設(shè)為:T(n),則T(n) = n,當 n = 1時,T(1) = 1

由于在合并時,兩個子序列已經(jīng)排好序,所以在合并的時候只需要 if 判斷即可,所以n個數(shù)比較,合并的時間復(fù)雜度為 n。

  • 將 n 個數(shù)的序列,分為兩個 n/2 的序列,則:T(n) = 2T(n/2) + n
  • 將 n/2 個數(shù)的序列,分為四個 n/4 的序列,則:T(n) = 4T(n/4) + 2n
  • 將 n/4 個數(shù)的序列,分為八個 n/8 的序列,則:T(n) = 8T(n/8) + 3n
  • 將 n/2k 個數(shù)的序列,分為2k個 n/2k 的序列,則:T(n) = 2kT(n/2k) + kn

當 T(n/2k) = T(1)時, 即n/2k = 1(此時也是把n分解到只有1個數(shù)據(jù)的時候),轉(zhuǎn)換為以2為底n的對數(shù):k = log2n,把k帶入到T(n)中,得:T(n) = n + nlog2n。

使用大O表示法,去掉常數(shù)項 n,省略底數(shù) 2,則歸并排序的時間復(fù)雜度為:O(nlogn)

算法穩(wěn)定性

從原理分析和代碼可以看出,為在合并的時候,如果相等,選擇前面的元素到輔助數(shù)組,所以歸并排序是穩(wěn)定的。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java中枚舉的實現(xiàn)與應(yīng)用詳解

    Java中枚舉的實現(xiàn)與應(yīng)用詳解

    這篇文章主要介紹了Java中枚舉的實現(xiàn)與應(yīng)用詳解,EnumTest中還有一個VALUES數(shù)組,里面存儲著所有的枚舉實例,調(diào)用values方法時返回VALUES數(shù)組的clone,需要的朋友可以參考下
    2023-12-12
  • 詳解SpringBoot依賴注入和使用配置文件

    詳解SpringBoot依賴注入和使用配置文件

    這篇文章主要介紹了SpringBoot依賴注入和使用配置文件的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • IDEA 2020 無法啟動的解決辦法(啟動崩盤)附IDEA 2020 新功能

    IDEA 2020 無法啟動的解決辦法(啟動崩盤)附IDEA 2020 新功能

    這篇文章主要介紹了IDEA 2020 無法啟動的解決辦法(啟動崩盤)附IDEA 2020 新功能,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 解決運行jar包出錯:ClassNotFoundException問題

    解決運行jar包出錯:ClassNotFoundException問題

    這篇文章主要介紹了解決運行jar包出錯:ClassNotFoundException問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java Socket編程實例(三)- TCP服務(wù)端線程池

    Java Socket編程實例(三)- TCP服務(wù)端線程池

    這篇文章主要講解Java Socket編程中TCP服務(wù)端線程池的實例,希望能給大家做一個參考。
    2016-06-06
  • 深入理解Java8新特性之接口中的默認方法和靜態(tài)方法

    深入理解Java8新特性之接口中的默認方法和靜態(tài)方法

    從Java8開始,程序允許在接口中包含帶有具體實現(xiàn)的方法,使用default修飾,這類方法就是默認方法。默認方法在接口中可以添加多個,并且Java8提供了很多對應(yīng)的接口默認方法,接下來讓我們一起來看看吧
    2021-11-11
  • Feign?請求動態(tài)URL方式

    Feign?請求動態(tài)URL方式

    這篇文章主要介紹了Feign?請求動態(tài)URL方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 使用SpringSecurity設(shè)置角色和權(quán)限的注意點

    使用SpringSecurity設(shè)置角色和權(quán)限的注意點

    這篇文章主要介紹了使用SpringSecurity設(shè)置角色和權(quán)限的注意點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java實現(xiàn)上傳文件類型檢測過程解析

    java實現(xiàn)上傳文件類型檢測過程解析

    這篇文章主要介紹了java實現(xiàn)上傳文件類型檢測過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • JavaEE開發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳

    JavaEE開發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳

    本篇文章主要介紹了SpringMVC的相關(guān)知識。同時也會介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來看下吧
    2017-04-04

最新評論

伊宁县| 安宁市| 东光县| 昌邑市| 望城县| 靖远县| 内江市| 乌审旗| 水城县| 莆田市| 蒲江县| 丽水市| 木兰县| 环江| 名山县| 巴东县| 白山市| 普洱| 衡阳市| 天津市| 镇原县| 池州市| 青铜峡市| 贺州市| 西盟| 温宿县| 上林县| 镇原县| 新密市| 南平市| 怀安县| 视频| 贵南县| 普安县| 兴文县| 广宁县| 九江县| 历史| 巨鹿县| 裕民县| 雷山县|