中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java歸并排序舉例分析

發布時間:2021-11-18 10:40:31 來源:億速云 閱讀:130 作者:iii 欄目:開發技術

這篇文章主要介紹“Java歸并排序舉例分析”,在日常操作中,相信很多人在Java歸并排序舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java歸并排序舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

歸并排序原理

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

歸并排序API設計

類名Merge
構造方法Merge():創建Merge對象
成員方法

1.public static void sort(Comparable[] a):對數組內的元素進行排序

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

3.private static void merge(Comparable[] a,int lo,int mid,int hi):從索引lo到索引mid為一個子組,從索引mid+1到索引hi為另一個子組,把數組a中的這兩個子組的數據合并成一個有序的大組(從索引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數組中,索引i和索引j處的值

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

歸并排序代碼實現

public class Merge {
    //輔助數組
    private static Comparable[] assist;
    //對數組a中的元素進行排序
    public static void sort(Comparable[] a){
        assist=new Comparable[a.length];
        int lo=0;
        int hi=a.length-1;
        sort(a,lo,hi);
    }
    //對數組a中從lo到hi的元素進行排序
    private static void sort(Comparable[] a,int lo,int hi){
        if(hi<=lo){
            return;
        }
        int mid=lo+(hi-lo)/2;
        //對lo到mid之間的元素進行排序
        sort(a,lo,mid);
        //對mid+1到hi之間的元素進行排序
        sort(a,mid+1,hi);
        //對lo到mid這組數據和mid到hi這組數據進行歸并
        merge(a,lo,mid,hi);
    }
    //對數組中,從lo到mid為一組,從mid+1到hi為一組,對這兩組數據進行歸并
    public static void merge(Comparable[] a,int lo,int mid,int hi){
        //lo到mid這組數據和mid+1到hi這組數據歸并到輔助數組assist對應的索引處
        int i=lo;//定義一個指針,指向assist數組中開始填充數據的索引
        int p1=lo;//定義一個指針,指向第一組數據的第一個元素
        int p2=mid+1;//定義一個指針,指向第二組數據的第一個元素
        //比較左邊小組和右邊小組中的元素大小,哪個小,就把哪個數據填充到assist數組中
        while(p1<=mid&&p2<=hi){
            if(less(a[p1],a[p2])){
                assist[i++]=a[p1++];
            }else{
                assist[i++]=a[p2++];
            }
        }
        //把未填充的數據填到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;
    }
    //數組元素i和j交換位置
    private static void exchange(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
 
}
//測試代碼
 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));
    }
}

歸并排序的時間復雜度分析

歸并排序是分治思想的最典型的例子,上面的算法中,對a[lo..hi]進行排序,先將它分為a[lo..mid]和a[mid+1..hi]兩部分,分別通過遞歸調用將他們單獨排序,最后將有序的子數組歸并為最終的排序結果。該遞歸的出口在于如果一個數組不能再被分為兩個子數組,那么就會執行merge進行歸并,在歸并的時候判斷元素的大小進行排序。

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

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

到此,關于“Java歸并排序舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沂源县| 十堰市| 淮安市| 呼和浩特市| 罗定市| 万宁市| 五河县| 桐梓县| 定南县| 江川县| 新邵县| 敖汉旗| 凯里市| 黑河市| 轮台县| 喜德县| 古交市| 石门县| 长沙市| 新和县| 黄骅市| 方正县| 炎陵县| 宿松县| 廊坊市| 鸡泽县| 娱乐| 宣武区| 股票| 旬邑县| 什邡市| 思南县| 嘉鱼县| 安泽县| 茂名市| 乾安县| 霍城县| 武陟县| 秦安县| 眉山市| 河间市|