zoukankan      html  css  js  c++  java
  • 关于冒泡排序、选择排序、快速排序的一些见解。

    1、冒泡排序:
    function maopao(arr) {
      var temp;
      for (i = 0; i < arr.length - 1; i++) {
        for (j = 0; j < arr.length - 1 - i; j++) {
          if (arr[j] > arr[j + 1]) {
            temp = arr[j + 1];
            arr[j + 1] = arr[j];
            arr[j] = temp;
          }
        }
      }
      return arr;
    }
    var arr = [10, 209, 30, 4, 57]
    console.log(maopao(arr));
     
    冒泡排序使用的逻辑是两两进行比较,先选出最后一位,然后在外围循环第二轮开始之后,对比继续从下标为0的值开始两两比较,继续选出当前循环的最大值,依次类推。因为下标的最大值是arr.length-1,所以,外面的循环次数是下标的长度。在第一轮结束之后,第二轮照样是从下标为0的值开始对比,因此内循环的初始值为0,在i进行了增加之后,还想像原来一样的模式循环,则需要减去每次添加的i,内部外部双管齐下,一步步排除每次循环的最值,最后得出结果
     
    2、选择排序:
    function xuanze(arr) {
      var temp;
      for (i = 0; i < arr.length - 1; i++) {
        for (j = i + 1; j < arr.length; j++) {
          if (arr[i] > arr[j]) {
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
          }
        }
      }
      return arr;
    }
    var arr = [19, 3, 4, 324, 6, 45]
    console.log(xuanze(arr));
     
    选择排序又叫打擂台,是将每一轮最靠前的下标的值与其它位置的值进行对比,因此内部循环的初始下标为i+1,因为在对比的时候,不会和自己进行比较,没有意义。每个小循环将当前数组内最靠前的下标的值与其它值进行对比,若符合条件则交换位置,因此每轮小循环都会选出当前的排第一的值,在选出第一之后,下面的循环没有必要将他再与其它值进行比较,因此外层循环确定的是每个大循环的确认下标的位置,内循环则是从他的+1的位置开始向后进行比较。最初的时候是所有的值进行比较,依次类推,因此可以将所有轮循环的下标为0的值进行剔除,内循环的上限是数组的长度。
     
    3、快速排序
    function quickly(arr) {
      if (arr.length < 2) {
        return arr;
      }
      var left = [];
      var right = [];
      var mid;
      if (arr.length % 2 != 0) {
        mid = (arr.length + 1) / 2;
      } else {
          mid = arr.length / 2;
      }
      var leg = arr[mid];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] < arr[mid] && mid != i) {
          left.push(arr[i]);
        } else if (arr[i] >= arr[mid] && mid != i) {
          right.push(arr[i])
        }
      }
      return quickly(left).concat(leg).concat(quickly(right));
    }
    var arr = [12, 3, 45, 6, 3, 5, 6]
    console.log(quickly(arr));
     
    快速排序是从中间划分大小,大小分开两边,建立两个单独的数组,然后在单独的数组中进行递归,使每个数都被单独分开,最后将左中右三部分进行拼接导出最终的数据。递归停止的条件是每个数都单独被划分出来,也就是函数内数组的长度小于2。在确定中间值的时候,为了防止是奇数造成漏洞,可以先去判断当前数组的个数,若是奇数则进行(+1)/2的操作,确保中间值肯定是整数,接着利用循环将当前数组继续分为左右两个数组,依次类推。为了确保不会出现重复,循环里边的判断条件需要加一句中间值不等于当前的下标值。
  • 相关阅读:
    PHP中使用CURL实现Get和Post请求方法
    编码规范
    session跨域共享问题解决方案
    第二十七节 新增语义标签
    第二十六节 屏幕适配之rem单位
    第二十五节 屏幕适配之em单位
    第二十四节 屏幕适配之响应式布局
    第二十三节 屏幕适配之流体布局
    第二十二节 屏幕适配之适配布局类型
    第二十一节 屏幕适配之背景图尺寸的设置
  • 原文地址:https://www.cnblogs.com/asablog/p/10659516.html
Copyright © 2011-2022 走看看