面试官:冒泡排序如何减少比较次数?

233 阅读1分钟

对于原始的冒泡排序,我们是需要进行arr.length - 1次循环的,但可能在某次循环过程中,就已经将数组排好序了,此时我们便可以直接退出。那么,我们怎么判断数组是否已排好序呢?很简单,当在某次循环中没有发生变量交换时,就可以证明数组已经排好序了。下面的代码中的isChange就是用来标志是否存在变量交换,若不存在,则直接return结果。

function bubbleSort(arr) {
  const len = arr.length
  for (let i = 0; i < len - 1; i++) {
    let isChange = false
    for (let j = 0; j < len - i - 1; j++) {
      if (arr[j + 1] < arr[j]) {
        let tmp = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = tmp
        isChange = true
      }
    }
    if (!isChange) return arr
  }
  return arr
}