国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

歸并排序

CoyPan / 867人閱讀

摘要:概述歸并排序法是將兩個(gè)或兩個(gè)以上有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。

概述

歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列。

歸并排序采用的是遞歸來實(shí)現(xiàn),屬于“分而治之”,將目標(biāo)數(shù)組從中間一分為二,之后分別對(duì)這兩個(gè)數(shù)組進(jìn)行排序,排序完畢之后再將排好序的兩個(gè)數(shù)組“歸并”到一起,歸并排序最重要的也就是這個(gè)“歸并”的過程,歸并的過程中需要額外的跟需要?dú)w并的兩個(gè)數(shù)組長度一致的空間。

效果圖:

步驟

申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來存放合并后的序列

設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置

比較兩個(gè)指針?biāo)赶虻脑兀x擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置

重復(fù)步驟3直到某一指針達(dá)到序列尾

將另一序列剩下的所有元素直接復(fù)制到合并序列尾

實(shí)例

原始數(shù)據(jù):

3 5 2 6 2

歸并的前提是將數(shù)組分開,一分為二,再一分為二,分到不能再分,進(jìn)行歸并。

第一輪分隔,索引2 ((0+4)/2=2) 為中間

[3 5 2] [6 2]

第二輪分隔,對(duì)[3 5 2]進(jìn)行分隔

[3 5] [2] [6 2]

第三輪分隔,對(duì)[3 5]進(jìn)行分隔

[3] [5] [2] [6 2]

合并[3] [5]

[3 5] [2] [6 2]

合并[3 5] [2]

[2 3 5] [6 2]

第四輪分隔,對(duì)[6 2]進(jìn)行分隔

[2 3 5] [6] [2]

合并[6] [2]

[2 3 5] [2 6]

合并[2 3 5] [2 6]

[2 2 3 5 6]
代碼實(shí)現(xiàn)(Java)
package com.coder4j.main.arithmetic.sorting;

public class Merge {
    
    private static int mark = 0;

    /**
     * 歸并排序
     * 
     * @param array
     * @param low
     * @param high
     * @return
     */
    private static int[] sort(int[] array, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            mark++;
            System.out.println("正在進(jìn)行第" + mark + "次分隔,得到");
            System.out.println("[" + low + "-" + mid + "] [" + (mid + 1) + "-" + high + "]");
            // 左邊數(shù)組
            sort(array, low, mid);
            // 右邊數(shù)組
            sort(array, mid + 1, high);
            // 左右歸并
            merge(array, low, mid, high);
        }
        return array;
    }

    /**
     * 對(duì)數(shù)組進(jìn)行歸并
     * 
     * @param array
     * @param low
     * @param mid
     * @param high
     */
    private static void merge(int[] array, int low, int mid, int high) {
        System.out.println("合并:[" + low + "-" + mid + "] 和 [" + (mid + 1) + "-" + high + "]");
        int[] temp = new int[high - low + 1];
        int i = low;// 左指針
        int j = mid + 1;// 右指針
        int k = 0;
        // 把較小的數(shù)先移到新數(shù)組中
        while (i <= mid && j <= high) {
            if (array[i] < array[j]) {
                temp[k++] = array[i++];
            } else {
                temp[k++] = array[j++];
            }
        }
        // 兩個(gè)數(shù)組之一可能存在剩余的元素
        // 把左邊剩余的數(shù)移入數(shù)組
        while (i <= mid) {
            temp[k++] = array[i++];
        }
        // 把右邊邊剩余的數(shù)移入數(shù)組
        while (j <= high) {
            temp[k++] = array[j++];
        }
        // 把新數(shù)組中的數(shù)覆蓋array數(shù)組
        for (int m = 0; m < temp.length; m++) {
            array[m + low] = temp[m];
        }
    }

    /**
     * 歸并排序
     * 
     * @param array
     * @return
     */
    public static int[] sort(int[] array) {
        return sort(array, 0, array.length - 1);
    }

    public static void main(String[] args) {
        int[] array = { 3, 5, 2, 6, 2 };
        int[] sorted = sort(array);
        System.out.println("最終結(jié)果");
        for (int i : sorted) {
            System.out.print(i + " ");
        }
    }
}

測試輸出結(jié)果:

正在進(jìn)行第1次分隔,得到
[0-2] [3-4]
正在進(jìn)行第2次分隔,得到
[0-1] [2-2]
正在進(jìn)行第3次分隔,得到
[0-0] [1-1]
合并:[0-0] 和 [1-1]
合并:[0-1] 和 [2-2]
正在進(jìn)行第4次分隔,得到
[3-3] [4-4]
合并:[3-3] 和 [4-4]
合并:[0-2] 和 [3-4]
最終結(jié)果
2 2 3 5 6 

經(jīng)測試,與實(shí)例中結(jié)果一致。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65439.html

相關(guān)文章

  • 歸并排序 - Algorithms, Part I, week 3 MERGESORTS

    摘要:兩個(gè)單元素?cái)?shù)組的合并實(shí)際就是對(duì)這兩個(gè)數(shù)進(jìn)行了排序,即變?yōu)椋瑯釉賹?duì)后一組的兩個(gè)數(shù)歸并排序,即變?yōu)椋賹蓡卧獢?shù)組歸并成四單元數(shù)組即和歸并為。 前言 本周講解兩個(gè)50多年前發(fā)明,但今天仍然很重要的經(jīng)典算法 (歸并排序和快速排序) 之一 -- 歸并排序,幾乎每個(gè)軟件系統(tǒng)中都可以找到其中一個(gè)或兩個(gè)的實(shí)現(xiàn),并研究這些經(jīng)典方法的新變革。我們的涉及范圍從數(shù)學(xué)模型中解釋為什么這些方法有效到使這些算法...

    Jokcy 評(píng)論0 收藏0
  • 歸并排序就這么簡單

    摘要:歸并排序就這么簡單從前面已經(jīng)講解了冒泡排序選擇排序插入排序快速排序了,本章主要講解的是歸并排序,希望大家看完能夠理解并手寫出歸并排序快速排序的代碼,然后就通過面試了如果我寫得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。 歸并排序就這么簡單 從前面已經(jīng)講解了冒泡排序、選擇排序、插入排序,快速排序了,本章主要講解的是歸并排序,希望大家看完能夠理解并手寫出歸并排序快速排序的代碼,然后就通過面試了!如果...

    ingood 評(píng)論0 收藏0
  • Java排序歸并排序

    摘要:排序之歸并排序簡介歸并排序的算法是將多個(gè)有序數(shù)據(jù)表合并成一個(gè)有序數(shù)據(jù)表。如果參與合并的只有兩個(gè)有序表,則成為二路合并。對(duì)于一個(gè)原始的待排序數(shù)列,往往可以通過分割的方法來歸結(jié)為多路合并排序。 Java排序之歸并排序 1. 簡介 歸并排序的算法是將多個(gè)有序數(shù)據(jù)表合并成一個(gè)有序數(shù)據(jù)表。如果參與合并的只有兩個(gè)有序表,則成為二路合并。對(duì)于一個(gè)原始的待排序數(shù)列,往往可以通過分割的方法來歸結(jié)為多路合...

    gityuan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<