Algorithm之排序之歸併排序

[color=green][size=medium][b]Algorithm之排序之歸併排序[/b][/size][/color]

[size=medium][b]一、歸併介紹[/b][/size]

動畫1:
[img]http://dl2.iteye.com/upload/attachment/0122/6931/509b2211-9b80-33bd-aab5-bbac401346dc.gif[/img]

動畫2:
[img]http://dl2.iteye.com/upload/attachment/0122/6935/a57c1769-3773-3a56-b851-31dbc0ca68f7.gif[/img]


[b]歸併排序[/b](英語:Merge sort,或 mergesort),
是創建在歸併操作上的一種有效的排序算法,效率爲O(n log n)。

1945年由約翰·馮·諾伊曼首次提出。

該算法是採用[b]分治法[/b](Divide and Conquer)的一個非常典型的應用,
且各層分治遞歸可以同時進行。


時間複雜度 O(n log n)
時間複雜度最優 O(n)
時間複雜度平均 O(n log n)
空間複雜度 O(n)


[b]執行過程:[/b]
通過動畫可以看出,歸併排序的執行過程是:先分再排。
——先將最大集合分成小集合,遞歸直至最小的單個集合。
——再對小集合進行排序組成二級小集合。
——以此類推而形成最大的集合。


[size=medium][b]二、具體實現[/b][/size]

[b]1、Javascript:[/b]

Array.prototype.merge_sort = function() {
if (this.length == 1) return this;
var mid = this.length >> 1;
var merge = function(left, right) {
var _final = [];
while (left.length && right.length)
_final.push(left[0] <= right[0] ? left.shift() : right.shift());
return _final.concat(left.concat(right));
};
return merge(this.slice(0, mid).merge_sort(), this.slice(mid).merge_sort());
};



// Array.prototype.shift()
// The shift() method removes the first element
// from an array and returns that element.


測試:

var arr = [1,23,14,8,10,9,235,21];


// merge_sort() 方法返回一個新數組
arr.merge_sort();
// [1, 8, 9, 10, 14, 21, 23, 235]


// 並未改變原來的數組。
arr
// [1, 23, 14, 8, 10, 9, 235, 21]


[b]2、Java 版本:[/b]

static void merge_sort_recursive(int[] arr, int[] result, int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, result, start1, end1);
merge_sort_recursive(arr, result, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
result[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
result[k++] = arr[start1++];
while (start2 <= end2)
result[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = result[k];
}

public static void merge_sort(int[] arr) {
int len = arr.length;
int[] result = new int[len];
merge_sort_recursive(arr, result, 0, len - 1);
}




引自:
https://zh.wikipedia.org/wiki/歸併排序


-
發佈了279 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章