1. 程式人生 > >演算法設計與分析筆記——合併排序

演算法設計與分析筆記——合併排序

簡介

合併排序演算法是用分治策略實現對n個元素進行排序的演算法。其 基本思想 是:將待排序元素分成大小大致相容的2個子集合,分別等於2個子集合進行排序,最終將排好序的子集合合併成為所要求的排好序的集合。

·

圖解:

這裡寫圖片描述

非遞迴合併排序演算法

public static void mergeSort(Comparable a[], int left, int right){
    Comparable []b = new Comparable[a.length];
    int s = 1;
    while(s < a.length){
        mergePass(a, b, s);   // 合併到陣列b
s += s; mergePass(b, a, s); // 合併到陣列a s += s; } }

合併排序遞迴演算法

public static void mergeSort(Comparable a[], int left, int right){
    if(left < right){//至少有兩個元素
        int i = (left + right) / 2;     // 取中點
        mergeSort(a, left, i);
        mergeSort(a, i + 1, right);
        merge(a, b, left, i, right);    // 合併到陣列b
copy(a, b, left, right); // 複製回陣列a }
輔助演算法
> `public static void mergePass(Comparable []x , Comparable []y , int s){
     // 合併大小為s的相鄰子陣列
     int i = 0;
      while(i <= x.length - 2 * s){
            merge(x, y, i, i+s-1, i+2*s-1);
            i = i + 2 * s;
        }
        // 剩下的元素個數少於2s
if(i + s < x.length) merge(x, y, i+s-1, x.length - 1); else for(int j = i; j < x.length; j++) y[j] = x[j]; }` > `public static void merge(Comparable []c , Comparable []d , int l, int m, int r){ // 合併c[1:m]和c[m+1:r]到d[1:r] int i = 1, j = m+1, k = 1; while((i <= m) && (j <= r)) if(c[i].compareTo(c[j]) <= 0) d[k++] = c[i++]; else d[k++] = c[j++]; if(i > m) for(int q = j; q <= r; q++) d[k++] = c[q]; else for(int q = i; q <= m; q++) d[k++] = c[q]; }