everycode icon indicating copy to clipboard operation
everycode copied to clipboard

2014年12月8日 D5

Open nunnly opened this issue 11 years ago • 9 comments

今天的练习,实现一个mergeSort函数,排序并合并数组。 归并排序往往是计算机教学中_分而治之_的一个典型例子,归并的策略既简单又具有深远意义。 今天的题目只是预热,实现一下功能 基本的思路是这样的

  1. 如果获得长度为1的数组,那么直接返回它的值
  2. 其他情况
  • 对前一个数组进行排序
  • 对后一个数组进行排序
  • 合并这两个已经进行过排序的数组 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]

nunnly avatar Dec 08 '14 02:12 nunnly

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]}

XadillaX avatar Dec 08 '14 02:12 XadillaX

-. - 好吧,最终题意:

function mergeSort(a, b) { return a.sort(function(a, b){return a - b;}).concat(b.sort(function(a, b){return a - b;})); }

XadillaX avatar Dec 08 '14 03:12 XadillaX

mergeSort([1, 12, 5], [2, 8, 13]) 躺枪的@XadillaX

nunnly avatar Dec 08 '14 03:12 nunnly

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]))

backsapce avatar Dec 08 '14 03:12 backsapce

/*
 * 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]

think2011 avatar Dec 08 '14 06:12 think2011

今天是预热,那么接下来的是很难的题目吗....

think2011 avatar Dec 08 '14 06:12 think2011

/*支持任意数量数组*/
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]));

excellnn avatar Dec 08 '14 09:12 excellnn

不管别人写的多牛逼 还是得自己动手写一下

function mergeSort(a, b) {
    // 这里略去对a,b的判断 :dash:
    var compareFn = function(a, b) { return a - b; }
    return a.sort(compareFn).concat( b.sort(compareFn) );
}

Blueria avatar Dec 08 '14 10:12 Blueria

发现和楼上一样,但还是发一下吧;

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]);

clearfixed avatar Dec 08 '14 10:12 clearfixed