前言:
分治法是一種算法設計思想,所謂分治,意為分而治之,是指將一個難以直接解決的大問題,遞歸的分割成一些規模的較小的問題,以便逐個解決。采用分治法設計的算法通常用到遞歸算法來實現,故標題為遞歸分治。
歸並排序算法
歸並就是將兩個或兩個以上的有序表合並成一個新的有序表。歸並排序就是將無序的待排序的序列分解成若干個有序的子序列,並把有序子序列合並為整體有序序列的過程。一般分為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)