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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章