算法课:排序

本文参考渡一内容以及这篇博客
https://www.cnblogs.com/lvmylife/p/7208541.html

冒泡排序

双重循环

function bubble (arr)
  for(var i = 0; i < arr.length - 1;i++){
    for(var j = i + 1;j <  arr.length;j++){
      if(arr[i] > arr[j]){
      var temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
}
}
return arr;
}

快速排序:版本1.0

 var arr = [1, 5, 2, 9, 8, 5, 3, 65, 7, 5, 6, 56, 1];
      function quickArr(arr) {
        var left = [],
          right = [];
        if(arr.length <= 1) {
          return arr;
        }
        var pIndex = Math.floor(arr.length / 2);
        var p = arr.splice(pIndex,1)[0];
        for(var i = 0; i < arr.length; i++) {
          if(arr[i] <= p) {
            left.push(arr[i]);
          } else {
            right.push(arr[i]);
          }

        }
        return quickArr(left).concat([p],quickArr(right));
      }

这么写是有bug的,返回的数组是正常的,但因为splice会把影响原来的arr.
可以对参数进行处理.

快速排序版本1.1

var arr = [1, 5, 2, 9, 8, 5, 3, 65, 7, 5, 6, 56, 1];
      function quickArr(arr) {
        var arr = [].concat(arr);//这样就不会对原数组产生影响,似乎也是纯函数的思想.
        var left = [],
          right = [];
        if(arr.length <= 1) {
          return arr;
        }
        var pIndex = Math.floor(arr.length / 2);
        var p = arr.splice(pIndex,1)[0];
        for(var i = 0; i < arr.length; i++) {
          if(arr[i] <= p) {
            left.push(arr[i]);
          } else {
            right.push(arr[i]);
          }

        }
        return quickArr(left).concat([p],quickArr(right));
      }

当然问题的根本在于用了splice,我们大可以不用splice

快速排序2.0

var arr = [1, 5, 2, 9, 8, 5, 3, 65, 7, 5, 6, 56, 1];

      function quickArr(arr) {
        var left = [],
          right = [],
          key = arr[0],
          mid = [key],
          len = arr.length;
          if(len <= 1) {
            return arr
          }
          for(var i = 1; i < len; i++) {
          //其实这种for循环的边界设置,才是最微妙的地方..
            if(arr[i] < key) {
              left.push(arr[i]);
            }else if(arr[i] > key){
              right.push(arr[i]);
            }else {
              mid.push(arr[i]);
            }
          }
          return quickArr(left).concat(mid,quickArr(right));
      }

      console.log(quickArr(arr));

快速排序2.1 可能的bug

为什么一定要把基准数给剔除来?
var arr = [1, 5, 2, 9, 8, 5, 3, 65, 7, 5, 6, 56, 1];

      function quickArr(arr) {
        var left = [],
          right = [],
          key = arr[0],
          mid = [key],
          len = arr.length;
          if(len <= 1) {
            return arr
          }
          for(var i = 0; i < len; i++) {//这里改成0
            if(arr[i] < key) {
              left.push(arr[i]);
            }else if(arr[i] > key){
              right.push(arr[i]);
            }else {
              mid.push(arr[i]);
            }
          }
          return quickArr(left).concat(quickArr(right));//这里去掉mid
      }

      console.log(quickArr(arr));

这样会报错,会进入死循环,因为最后[1,1]的时候,len等于2,
然后死循环.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容