javascript实现冒泡排序

418 阅读2分钟
  • 排序方法:将相邻两个元素进行比较,如果后一个元素大,则交换位置,则每一个循环会得到数据的最大值
  • 时间复杂度: O(n^2),不稳定,最好的情况一次循环即可排好即复杂度为O(n)
  • 空间复杂度: O(1)
/**
* 单向冒泡排序
* 每一个循环找到一个最大值
*/
function bubbleSort(arr) {
  for (let i = 0, len = arr.length; i < len; i++) {
    // 提前中断标志
    let flag = true;
    //注意此处的j<len-i-1
    //因为每次比较j和j+1位的元素,因此需要j<len-1
    //并且每一次循环可以得到一个最大值,最大值在最后一位,因此接下来的循环     没有必要再用前值和最后已经排好的元素进行比较了,因此第i个循环就少比较i个数
    for (let j = 0; j < len - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        flag = false;
      }
    }
    //当一次循环结束后,没有交换过元素,则已经排好,可以提前结束排序
    if (flag) return arr;
  }
  return arr;
}
/**
*双向冒泡排序
每此两个循环,分别找到最大值和最小值
*
*/
function bubbleSort(arr) {
  //右循环从
  [low, high] = [0, arr.length - 1];

  while (low < high) {
    //提前中断标志
    let flag = true;
    
    //第一次左循环从0开始,比较 low和low+1,找到最大值.此后从low开始,因为每次的右循环会找到最小值,
    //注意:i<high,因为每一个循环都会找到一个最大值,而high即为每次循环的最右边值,因此每次比较到high即可,high右边都是已经排好的最大值
    for (let i = low; i < high; i++) {
      if (arr[i] > arr[i + 1]) {
        [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
        flag = false;
      }
    }
    //注意此处,因为上边的左循环已经找到了最大值,因此右循环从high-1位开始
    high--;
    for (let j = high; j > low; j--) {
      if (arr[j - 1] > arr[j]) {
        [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
        flag = false;
      }
    }
    //右循环找到了最小值,因此low++让下次的左循环从下一位开始
    low++;
    
    //若左循环、右循环均未发生交换则,则说明已经排好循序,直接返回
    if (flag) return arr;
  }
  return arr;
}