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

Java 十大排序算法之歸并排序刨析

 更新時(shí)間:2021年11月18日 09:13:50   作者:龍弟-idea  
歸并排序是采用分治法的一個(gè)非常典型的應(yīng)用。先使每個(gè)子序列有序,再使子序列段間有序,也就是將已有的子序列合并,得到完全有序的序列;如果將兩個(gè)有序表合并成一個(gè)有序表,稱(chēng)為二路歸并

歸并排序原理

1.盡可能的一組數(shù)據(jù)拆分成兩個(gè)元素相等的子組,并對(duì)每一個(gè)子組繼續(xù)拆分,直到拆分后的每個(gè)子組的元素個(gè)數(shù)是1為止。
⒉將相鄰的兩個(gè)子組進(jìn)行合并成一個(gè)有序的大組。
3.不斷的重復(fù)步驟2,直到最終只有一個(gè)組為止。

歸并排序API設(shè)計(jì)

類(lèi)名 Merge
構(gòu)造方法 Merge():創(chuàng)建Merge對(duì)象
成員方法

1.public static void sort(Comparable[] a):對(duì)數(shù)組內(nèi)的元素進(jìn)行排序

2.private static void sort(Comparable[] a,int lo,int hi):對(duì)數(shù)組a中從索引lo到索引hi之間的元素進(jìn)行排序

3.private static void merge(Comparable[] a,int lo,int mid,int hi):從索引lo到索引mid為一個(gè)子組,從索引mid+1到索引hi為另一個(gè)子組,把數(shù)組a中的這兩個(gè)子組的數(shù)據(jù)合并成一個(gè)有序的大組(從索引lo到索引hi)

4.private static boolean less(Comparable v,Comparable w):判斷v是否小于w

5.private static void exchange(Comparable[] a,int i,int j):交換a數(shù)組中,索引i和索引j處的值

成員變量 private static ComParable[] assit:完成歸并操作需要的輔助數(shù)組

歸并排序代碼實(shí)現(xiàn)

public class Merge {
    //輔助數(shù)組
    private static Comparable[] assist;
    //對(duì)數(shù)組a中的元素進(jìn)行排序
    public static void sort(Comparable[] a){
        assist=new Comparable[a.length];
        int lo=0;
        int hi=a.length-1;
        sort(a,lo,hi);
    }
    //對(duì)數(shù)組a中從lo到hi的元素進(jìn)行排序
    private static void sort(Comparable[] a,int lo,int hi){
        if(hi<=lo){
            return;
        }
        int mid=lo+(hi-lo)/2;
        //對(duì)lo到mid之間的元素進(jìn)行排序
        sort(a,lo,mid);
        //對(duì)mid+1到hi之間的元素進(jìn)行排序
        sort(a,mid+1,hi);
        //對(duì)lo到mid這組數(shù)據(jù)和mid到hi這組數(shù)據(jù)進(jìn)行歸并
        merge(a,lo,mid,hi);
    }
    //對(duì)數(shù)組中,從lo到mid為一組,從mid+1到hi為一組,對(duì)這兩組數(shù)據(jù)進(jìn)行歸并
    public static void merge(Comparable[] a,int lo,int mid,int hi){
        //lo到mid這組數(shù)據(jù)和mid+1到hi這組數(shù)據(jù)歸并到輔助數(shù)組assist對(duì)應(yīng)的索引處
        int i=lo;//定義一個(gè)指針,指向assist數(shù)組中開(kāi)始填充數(shù)據(jù)的索引
        int p1=lo;//定義一個(gè)指針,指向第一組數(shù)據(jù)的第一個(gè)元素
        int p2=mid+1;//定義一個(gè)指針,指向第二組數(shù)據(jù)的第一個(gè)元素
        //比較左邊小組和右邊小組中的元素大小,哪個(gè)小,就把哪個(gè)數(shù)據(jù)填充到assist數(shù)組中
        while(p1<=mid&&p2<=hi){
            if(less(a[p1],a[p2])){
                assist[i++]=a[p1++];
            }else{
                assist[i++]=a[p2++];
            }
        }
        //把未填充的數(shù)據(jù)填到assist中
        while(p1<=mid){
            assist[i++]=a[p1++];
        }
        while(p2<=hi){
            assist[i++]=a[p2++];
        }
        for(int index=lo;index<=hi;index++){
            a[index]=assist[index];
        }
    }
    //比較v元素是否小于w元素
    private static boolean less(Comparable v,Comparable w){
        return v.compareTo(w)<0;
    }
    //數(shù)組元素i和j交換位置
    private static void exchange(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
 
}
//測(cè)試代碼
 class Test{
    public static void main(String[] args) {
        Integer[] a={8,4,6,5,7,1,3,6,2};
        Merge.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

歸并排序的時(shí)間復(fù)雜度分析

歸并排序是分治思想的最典型的例子,上面的算法中,對(duì)a[lo..hi]進(jìn)行排序,先將它分為a[lo..mid]和a[mid+1..hi]兩部分,分別通過(guò)遞歸調(diào)用將他們單獨(dú)排序,最后將有序的子數(shù)組歸并為最終的排序結(jié)果。該遞歸的出口在于如果一個(gè)數(shù)組不能再被分為兩個(gè)子數(shù)組,那么就會(huì)執(zhí)行merge進(jìn)行歸并,在歸并的時(shí)候判斷元素的大小進(jìn)行排序。

用樹(shù)狀圖來(lái)描述歸并,如果一個(gè)數(shù)組有8個(gè)元素,那么它將每次除以2找最小的子數(shù)組,共拆log8次,值為3,所以樹(shù)共有3層那么自頂向下第k層有2^k個(gè)子數(shù)組,每個(gè)數(shù)組的長(zhǎng)度為2^(3-k),歸并最多需要2^(3-k)次比較。因此每層的比較次數(shù)為2^k * 2^(3-k)=2^3,那么3層總共為3*2^3。

假設(shè)元素的個(gè)數(shù)為n,那么使用歸并排序拆分的次數(shù)為log2(n).所以共log2(n)層,那么使用log2(n)替換上面3*2^3中的3這個(gè)層數(shù),最終得出的歸并排序的時(shí)間復(fù)雜度為︰log2(n)*2^(log2(n))=log2(n)*n,根據(jù)大O推導(dǎo)法則,忽略底數(shù),最終歸并排序的時(shí)間復(fù)雜度為O(nlogn);
歸并排序的缺點(diǎn)∶
需要申請(qǐng)額外的數(shù)組空間,導(dǎo)致空間復(fù)雜度提升,是典型的以空間換時(shí)間的操作。

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

相關(guān)文章

  • Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解

    Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • Spring整合Mybatis思路梳理總結(jié)

    Spring整合Mybatis思路梳理總結(jié)

    MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,本篇文章帶你了解Spring整合Mybatis的思路
    2022-02-02
  • Java中comparator接口和Comparable接口的比較解析

    Java中comparator接口和Comparable接口的比較解析

    這篇文章主要介紹了Java中comparator接口和Comparable接口的比較解析,Java提供了一個(gè)用于比較的接口Comparator和Comparable接口,提供了一個(gè)比較的方法,所有實(shí)現(xiàn)該接口的類(lèi),都動(dòng)態(tài)的實(shí)現(xiàn)了該比較方法,需要的朋友可以參考下
    2023-08-08
  • Java8新特性 StreamAPI實(shí)例詳解

    Java8新特性 StreamAPI實(shí)例詳解

    這篇文章主要為大家介紹了Java8新特性 StreamAPI實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • JAVA中StackOverflowError錯(cuò)誤的解決

    JAVA中StackOverflowError錯(cuò)誤的解決

    這篇文章主要介紹了JAVA中StackOverflowError錯(cuò)誤的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java中DecimalFormat四舍五入用法詳解

    java中DecimalFormat四舍五入用法詳解

    這篇文章主要為大家詳細(xì)介紹了java中DecimalFormat四舍五入的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法示例

    java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法示例

    這篇文章主要介紹了java統(tǒng)計(jì)漢字字?jǐn)?shù)的方法,結(jié)合實(shí)例形式分析了java正則判定、字符串遍歷及統(tǒng)計(jì)相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • SpringBoot實(shí)現(xiàn)國(guó)際化的操作步驟

    SpringBoot實(shí)現(xiàn)國(guó)際化的操作步驟

    國(guó)際化(Internationalization) 是指為了適應(yīng)不同語(yǔ)言、文化和地區(qū)的用戶(hù),使軟件能夠方便地進(jìn)行本地化修改的過(guò)程,本文介紹了SpringBoot 國(guó)際化功能的簡(jiǎn)單使用,感興趣的朋友可以參考下
    2024-02-02
  • logback高效狀態(tài)管理器StatusManager源碼解析

    logback高效狀態(tài)管理器StatusManager源碼解析

    這篇文章主要為大家介紹了logback高效狀態(tài)管理器StatusManager源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Spring中ClassPathXmlApplicationContext類(lèi)的使用詳解

    Spring中ClassPathXmlApplicationContext類(lèi)的使用詳解

    這篇文章主要介紹了Spring中ClassPathXmlApplicationContext類(lèi)的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

石嘴山市| 新津县| 白沙| 清涧县| 西丰县| 筠连县| 宁河县| 柳林县| 永吉县| 仪征市| 长寿区| 兴国县| 巴林左旗| 萍乡市| 平阳县| 准格尔旗| 江达县| 樟树市| 西乌珠穆沁旗| 阳原县| 阜康市| 集安市| 泸西县| 射阳县| 裕民县| 万年县| 北辰区| 六安市| 乌兰县| 金溪县| 西昌市| 历史| 罗山县| 山东| 瑞昌市| 金川县| 南开区| 宁化县| 许昌县| 关岭| 三河市|