淺析java 歸併排序演算法_java

來源:互聯網
上載者:User

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

歸併排序是建立在歸併操作上的一種有效排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為2-路歸併。

歸併排序演算法穩定,數組需要O(n)的額外空間,鏈表需要O(log(n))的額外空間,時間複雜度為O(nlog(n)),演算法不是自適應的,不需要對資料的隨機讀取。

工作原理:

1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并後的序列

2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

3、比較兩個指標所指向的元素,選擇相對小的元素放入到合并空間,並移動指標到下一位置

4、重複步驟3直到某一指標達到序列尾

5、將另一序列剩下的所有元素直接複製到定序序列尾

運行代碼

複製代碼 代碼如下:

package com.zc.manythread;
import java.util.Random;
/**
 * 歸併排序
 * @author 偶my耶
 *
 */
public class MergeSort {
    public static void mergeSort(int[] data) {
        sort(data, 0, data.length - 1);
    }
    public static void sort(int[] data, int left, int right) {
        if (left >= right)
            return;
        // 找出中間索引
        int center = (left + right) / 2;
        // 對左邊數組進行遞迴
        sort(data, left, center);
        // 對右邊數組進行遞迴
        sort(data, center + 1, right);
        // 合并
        merge(data, left, center, right);
        print(data);
    }
    /**
     * 將兩個數組進行歸併,歸併前面2個數組已有序,歸併後依然有序
     *
     * @param data
     *            數組對象
     * @param left
     *            左數組的第一個元素的索引
     * @param center
     *            左數組的最後一個元素的索引,center+1是右數組第一個元素的索引
     * @param right
     *            右數組最後一個元素的索引
     */
    public static void merge(int[] data, int left, int center, int right) {
        // 臨時數組
        int[] tmpArr = new int[data.length];
        // 右數組第一個元素索引
        int mid = center + 1;
        // third 記錄臨時數組的索引
        int third = left;
        // 緩衝左數組第一個元素的索引
        int tmp = left;
        while (left <= center && mid <= right) {
            // 從兩個數組中取出最小的放入臨時數組
            if (data[left] <= data[mid]) {
                tmpArr[third++] = data[left++];
            } else {
                tmpArr[third++] = data[mid++];
            }
        }
        // 剩餘部分依次放入臨時數組(實際上兩個while只會執行其中一個)
        while (mid <= right) {
            tmpArr[third++] = data[mid++];
        }
        while (left <= center) {
            tmpArr[third++] = data[left++];
        }
        // 將臨時數組中的內容拷貝回原數組中
        // (原left-right範圍的內容被複製回原數組)
        while (tmp <= right) {
            data[tmp] = tmpArr[tmp++];
        }
    }
    public static void print(int[] data) {
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + "\t");
        }
        System.out.println();
    }
    /**
     * 產生隨機數組
     * @param count
     * @return
     */
    private static int[]  createDate(int count) {
        int[] data=new int[count];
          Random rand = new Random();
          boolean[] bool = new boolean[100];
          int num = 0;
          for (int i = 0; i < count; i++) {
           do {
            // 如果產生的數相同繼續迴圈
            num = rand.nextInt(100);
           } while (bool[num]);
           bool[num] = true;
           data[i]=num;
          }
          return data;
    }
    public static void main(String[] args) {
        int[] data = createDate(10);
        print(data);
        mergeSort(data);
        System.out.println("排序後的數組:");
        print(data);
    }
}

運行結果:

以上就是本文的全部內容了,希望小夥伴能夠喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.