手写冒泡排序

225 阅读2分钟
    //手写冒泡排序
    function handlerSort(arr) {
        for(let i = 0; i < arr.length - 1; i ++) {
            for(let j = 0; j < arr.length - i -1; j ++) {
                if(arr[j] > arr[j + 1]) {
                    let tempt = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tempt
                }
            }
        }
        return arr;
    },
    
    
    

    //优化1,
  function handleSort(arr) {
      var flag;
      for(let i = 0; i < arr.length - 1; i ++) {
          flag = true;
          for(let j = 0; j < arr.length - i -1; j ++) {
              if(arr[j] > arr[j + 1]) {
                  let tempt = arr[j];
                  arr[j] = arr[j + 1];
                  arr[j + 1] = tempt;
                  flag = false;
              }
          }
      }

      if(flag) {
          //我们可以规定如果某次循环后flag依然为true的话,表明这次没有进行重新的元素交换,也就是说没有进行重新排序,那么此时数组中元素已经有序了,所以我们可以直接break跳出循环,return出数组
          break;
      }
  }


//   优化2
我们每次排序后,数组的后面有一部分已经有序了,所以我们也不需要再和后面已经排好序的元素再进行比较了,我们可以这样做,用一个变量来记录下最后一次发生交换的位置,后面没有发生交换的其实已经有序了,所以可以用这个值来作为一一次我们比较结束时的位置,将会减少很多次没必要的排序过程,代码实现如下:
      function handleSort(arr) {
      var flag;
      var lastIndex = 0;
      var k = arr.length - 1;
      for(let i = 0; i < arr.length; i ++) {
          flag = true;
          for(let j = 0; j < k; j ++) {
              if(arr[j] > arr[j + 1]) {
                  let tempt = arr[j];
                  arr[j] = arr[j + 1];
                  arr[j + 1] = tempt;
                  flag = false;
                  lastIndex = j;
              }
          }
          k = lastIndex;
      }

      if(flag) {
          //我们可以规定如果某次循环后flag依然为true的话,表明这次没有进行重新的元素交换,也就是说没有进行重新排序,那么此时数组中元素已经有序了,所以我们可以直接break跳出循环,return出数组
          break;
      }
  }