美文网首页
JavaScript排序——冒泡法排序

JavaScript排序——冒泡法排序

作者: 椰果粒 | 来源:发表于2019-05-22 20:54 被阅读0次

    什么是冒泡法排序

    冒泡法排序(升序的情况)就是一组无序的数,比较相邻的数,如果前面的数大于后面的数,交换位置,第一轮会得出一个最大的,冒泡到最右边;第二次第二大的数冒泡到右边第二个位置;以此类推,直到最后一次得到有序的序列。

    最一般的代码,这个代码最容易被想到

    /**
     * @desc 冒泡法排序(升序排序)
     * @param {Array} arr 要被排序的数组
     */
    var bubbleSort= function(arr){
      // 边界情况
      if(arr.length <= 1) return arr
      // 循环次数,只需要循环元素个数-1次就可以排完
      for(let i=arr.length-1, tmp; i>0 ;i--){
        // 每次循环
        for(let j=0; j<i; j++){
          tmp = arr[j]
          // 如果前面的数字比后面的大,就要交换
          if(arr[j] > arr[j+1]){
            arr[j] = arr[j+1]
            arr[j+1] = tmp
          }
        }
      }
      return arr
    }
    

    时间复杂度和空间复杂度

    平均时间复杂度:O(n^2)
    最好情况:O(n)
    最坏情况:O(n^2)
    空间复杂度:O(1)
    稳定性:稳定

    咋算出来的时间复杂度:
    time = (n-1)+(n-2)+(n-3)+.....+2+1 = n*(n-1)/2
    所以时间复杂度是O(n^2)

    冒泡排序时间复杂度还是很高的,对于大量数据时,最好不要用

    优化,这里贴出从最笨到最优化的情况

    /**
     * @description 数组冒泡法从小到大排序
     * @param {Array} arr 一个乱序数组
     * @return 排好序的数组
     */
    
    let arr = [4, 3, 2, 1];
    let arr1 = [1,2,3,4,5];
    
    // 最原始
    function bubbleSort1(arr) {
      let max = arr.length - 1;
      for (let j = 0; j < max; j++) {
        console.log("第" + (j + 1) + "次循环:")
        for (let i = 0; i < max; i++) {
          if (arr[i] > arr[i + 1]) {
            let temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
          }
          console.log(arr)
        }
      }
      // return arr
    }
    
    
    // 优化1:每次循环,冒泡到最后的那个都不用再进行排序了。
    function bubbleSort2 (arr) {
      // 边界情况
      if (arr.length <= 1) return arr
      // 循环次数
      for (let i = arr.length - 1, tmp; i > 0; i--) {
        console.log("第" + (arr.length-i) + "次循环:")
        // 每次循环
        for (let j = 0; j < i; j++) {
          tmp = arr[j]
          // 如果前面的数字比后面的大,就要交换
          if (arr[j] > arr[j + 1]) {
            arr[j] = arr[j + 1]
            arr[j + 1] = tmp
          }
          console.log(arr)
        }
      }
      // return arr
    }
    
    // 优化2:如果不再交换了,就说明已经是最优的了,就不必再循环了
    function bubbleSort3(arr) {
      let max = arr.length - 1;
      let temp = [];
      for (let j = 0; j < max; j++) { // 第j轮循环
        console.log("第" + (j + 1) + "次循环:")
        let done = true;        // 优化1:如果不再交换了,就说明已经是最优的了,就不必再循环了
        for (let i = 0; i < max - j; i++) { // 每轮训话具体的操作
          if (arr[i] > arr[i + 1]) {  // 要交换
            temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
            done = false;
          }
          console.log(arr)
        }
        if (done) break; // 跳出循环
      }
      // return arr
    }
    
    // 优化3:界定有序边界值
    function bubbleSort4(arr) {
      let sortBorder = arr.length - 1;
      let temp = [];
      let lastChangeIndex = 0;
      for (let j = 0; j < arr.length; j++) {
        console.log("第" + (j + 1) + "次循环:")
        let done = true;
        for (let i = 0; i < sortBorder; i++) {
          if (arr[i] > arr[i + 1]) {
            temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
            done = false;
            lastChangeIndex = i;
          }
          console.log(arr)
        }
        sortBorder = lastChangeIndex;
        if (done) break;
      }
      // return arr
    }
    

    相关文章

      网友评论

          本文标题:JavaScript排序——冒泡法排序

          本文链接:https://www.haomeiwen.com/subject/murpzqtx.html