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的操作,确保中间值肯定是整数,接着利用循环将当前数组继续分为左右两个数组,依次类推。为了确保不会出现重复,循环里边的判断条件需要加一句中间值不等于当前的下标值。
  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/asablog/p/10659516.html
Copyright © 2011-2022 走看看