遞歸分治算法(一)-歸並排序算法


前言:

分治法是一種算法設計思想,所謂分治,意為分而治之,是指將一個難以直接解決的大問題,遞歸的分割成一些規模的較小的問題,以便逐個解決。采用分治法設計的算法通常用到遞歸算法來實現,故標題為遞歸分治。

歸並排序算法

歸並就是將兩個或兩個以上的有序表合並成一個新的有序表。歸並排序就是將無序的待排序的序列分解成若干個有序的子序列,並把有序子序列合並為整體有序序列的過程。一般分為2-路歸並排序和多路歸並排序。

他的大概流程如下圖:

 

我們來看看java代碼怎么寫的:

package guibing;

/***
 * @author 文聰
 * @date 2016/9/26
 *  歸並排序算法
 **/
public class Sort {
    public static void main(String[] args) {
        int[] a = {42,30,68,98,86,15,57};
        sort(a, 0, a.length-1);
        for (int i : a) {
            System.out.print(i+" ");
        }
}

    public static void sort(int[] a, int left, int right) {
        if (left >= right)
            return;

        int center = (left + right) >> 1;
        sort(a, left, center);
        sort(a, center + 1, right);
        merge(a, left, center, right);
}

    public static void merge(int[] data, int left, int center, int right) {
        int[] tmpArr = new int[right+1];
        int mid = center + 1;
        int index = left; // index記錄臨時數組的索引
        int tmp = left;

        // 從兩個數組中取出最小的放入中臨時數組
        while (left <= center && mid <= right) {
            tmpArr[index++] = (data[left] <= data[mid]) ? data[left++]: data[mid++];
        }
        // 剩余部分依次放入臨時數組
        while (mid <= right) {
            tmpArr[index++] = data[mid++];
        }
        while (left <= center) {
            tmpArr[index++] = data[left++];
        }
        // 將臨時數組中的內容復制回原數組
        for (int i = tmp; i <= right; i++) {
            data[i] = tmpArr[i];
        }
}
}

總結:對歸並排序算法進行分析發現,每一層歸並排序都是將區間[left,right]划分為兩個大致相等的子序列,然后進行歸並。排序過程需要進行[logn]層的遞歸分解和歸並,由此的歸並排序的算法時間復雜度為O(nlogn),空間復雜度也為O(n)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM