everycode
everycode copied to clipboard
2014年12月8日 D5
今天的练习,实现一个mergeSort函数,排序并合并数组。
归并排序往往是计算机教学中_分而治之_的一个典型例子,归并的策略既简单又具有深远意义。
今天的题目只是预热,实现一下功能
基本的思路是这样的
- 如果获得长度为
1的数组,那么直接返回它的值 - 其他情况
- 对前一个数组进行排序
- 对后一个数组进行排序
- 合并这两个已经进行过排序的数组 PS :合并的数组不需要排序
/*
* param1 (Array Number)
* param2 (Array Number)
* return Array
*/
function mergeSort(a, b) {
}
mergeSort([1,2],[3,4]) // => [1,2,3,4]
mergeSort([1,2],[3]) // => [1,2,3]
mergeSort([1],[2, 3]) // => [1,2,3]
mergeSort([1, 12, 5], [2, 8, 13]) //=> [1, 5, 12, 2 ,8 13]
function mergeSort(a, b) {
return (new Array(a.length + b.length)).join("*").split("*").reduce(function(ans) {
return ans[2].push(ans[((ans[0].length && ans[1].length) ? (ans[0] < ans[1]) : (ans[0].length)) ^ 1].shift()), ans;
}, [ a.sort(function(a, b) { return a - b; }), b.sort(function(a, b) { return a - b; }), [] ])[2];
}
&&
function mergeSort(a,b){return new Array(a.length+b.length).join("*").split("*").reduce(function(a){return a[2].push(a[1^(a[0].length&&a[1].length?a[0]<a[1]:a[0].length)].shift()),a},[a.sort(function(a,b){return a-b}),b.sort(function(a,b){return a-b}),[]])[2]}
-. - 好吧,最终题意:
function mergeSort(a, b) { return a.sort(function(a, b){return a - b;}).concat(b.sort(function(a, b){return a - b;})); }
mergeSort([1, 12, 5], [2, 8, 13])
躺枪的@XadillaX
function mergeSort(a, b) {
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
var merge= function (a,b) {
var c = new Array(a.length+b.length);
for (var i = 0; i < c.length; i++) {
c[i] = (a[i] == null?b[i-a.length]:a[i])
}
return c
}
return merge(quickSort(a),quickSort(b))
}
console.log(mergeSort([1,2],[3,4]))
console.log(mergeSort([1,2],[3]))
console.log(mergeSort([1],[2, 3]))
console.log(mergeSort([1, 12, 5], [2, 8, 13]))
/*
* param1 (Array Number)
* param2 (Array Number)
* return Array
*/
function mergeSort(a, b) {
var _sort = function(a, b) {
return a - b
}
return a.sort(_sort).concat(b);
}
// 测试用例
console.log(mergeSort([1, 2], [3, 4])) // => [1,2,3,4]
console.log(mergeSort([1, 2], [3])) // => [1,2,3]
console.log(mergeSort([1], [2, 3])) // => [1,2,3]
console.log(mergeSort([1, 12, 5], [2, 8, 13])); //=> [1, 5, 12, 2 ,8 13]
今天是预热,那么接下来的是很难的题目吗....
/*支持任意数量数组*/
function mergeSort(){
var sortArr = [];
Array.prototype.slice.call(arguments).forEach(function(v){
sortArr.push(v.sort(function(a,b){
return a-b;
}));
});
return [].concat.apply( [], sortArr );
}
console.log('end:',mergeSort([1,5,3],[20,12,11]));
console.log('end:',mergeSort([1,5,3],[20,12,11],[20,12,299,11,10,29]));
不管别人写的多牛逼 还是得自己动手写一下
function mergeSort(a, b) {
// 这里略去对a,b的判断 :dash:
var compareFn = function(a, b) { return a - b; }
return a.sort(compareFn).concat( b.sort(compareFn) );
}
发现和楼上一样,但还是发一下吧;
function rank(a, b){
var fairly = function ( x ,y ){ return x - y };
return a.sort(fairly).concat(b.sort(fairly));
}
rank([1, 2, 3 ,12, 11], [23, 123, 4123 ,12]);