zoukankan      html  css  js  c++  java
  • 快速排序

      

    1.(1)在数据集之中,选择一个元素作为"基准"(pivot)。

      (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

      (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其排序呢?

    第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)

    第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。

    第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    特点 就是对2个子集不断重复第一步和第二步

    首先,定义一个quickSort函数,它的参数是一个数组。

    var quicksort= function(){}

    然后,检查数组的元素个数,如果小于等于1,就返回。

    var quickSort = function(arr) {

      if (arr.length <= 1) { return arr; }

    };

    接着,选择"基准"(pivot),并将其与原数组分离,再定义两个空数组,用来存放一左一右的两个子集。

    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 arr=[1,32];
      //console.log(arr.splice(0,1)[0]) 这里是获取中间的元素

      var left = [];

      var right = [];

    };

    然后,开始遍历数组,小于"基准"的元素放入左边的子集,大于基准的元素放入右边的子集。

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

        }

      }

    };

    最后,使用递归不断重复这个过程,就可以得到排序后的数组。

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

    };

    这里有个concact函数 这里有2个参数 友情提示:这里的pivot其实是为了让你包装变成一个数组的.

    然后这里的递归就是..你第一次循环的时候就有left 和right2个数组

    那么现在 left 就是[1,23,33] pivot就是44 right就是[55,223]

    所以就是quickSort(left).concat(44,quickSort(right))

    这个时候就是left这个函数进来啦...那么就再有一个中间的value 继续return quickSort(left).concat([pivot],quickSort(right)) 

    持续调用之后 当return到最后一个元素的时候就会直接跳出当前的循环..so

  • 相关阅读:
    http 性能测试. Apache ab 使用.
    JavaScript , js 上下文(this 的指代)
    nodejs --- querystring模块.
    NodeJs -- URL 模块.
    Node.js 回调函数 1) 阻塞 ,同步 2) 非阻塞 ,异步.
    NPM 使用介绍
    xampp 忘记密码的处理方式.
    css 伪类: 1)a:link , a:visited, a:hover, a:active 2):first-child
    background 的一些 小的细节: 1, 背景色覆盖范围: border+ width+ padding ;背景图覆盖范围: width + padding ; 2设置多个背景图片 ; 3) background-position定位百分比的计算方式: 4)background-clip 和 background-origin 的区别
    webstrom 里面使用github
  • 原文地址:https://www.cnblogs.com/esZhang/p/5783598.html
Copyright © 2011-2022 走看看