JS排序算法——冒泡排序


排序算法优劣说明:

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;

不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;

内排序:所有排序操作都在内存中完成;

外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;

事件复杂度:一个算法执行所耗费的事件;

空间复杂度:运行完一个程序所需内存的大小;

排序算法图片总结:



图片引用自 :    js十大排序算法


冒泡排序原理:

依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面,依照这个规则进行多次并且递减的迭代,直到排序顺序正确为止。

举例说明:

现在有一个数组为[2,5,3,1,4]

①排序开始,对比第一项和第二项,由于顺序是正确的,无需交换;

②对比第二项和第三项,由于5大于3,所以交换位置,3排到前面,结果是[2,3,5,1,4];

③对比第三项和第四项,由于5大于1,所以交换位置,1排到5前面,结果是[2,3,1,5,4];

④再次循环第二项和第三项,3大于1,交换位置,结果是[2,1,3,5,4];

⑤第一项和第二项交换,为[1,2,3,5,4],第四项和第五项交换为[1,2,3,4,5]。

冒泡排序:

冒泡排序的第一步其实就是写一个方法,用于交换数组里面需要交换位置的两个元素:

function exchangeNum (items, frontIndex, behindIndex) {
  var temp = items[frontIndex]
  items[frontIndex] = items[behindIndex]
  items[behindIndex] = temp
}

正向冒泡排序:

let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18]
// 外层循环控制的是循环遍历的次数,内层循环是遍历数组
// 因为需要两两比较大小,所以5个元素只需比较4次,arr.length个元素则比较arr.length-1次
for (let i = 0; i < arr.length - 1; i++) {
  for (let j = 0; j < arr.length - 1 - i; j++) {
    // 比较相邻的两个元素,如果前一个比后一个大,则交换位置
    if (arr[j] > arr[j + 1]) {
      exchangeNum(arr, j, j + 1)
    }
  }
}
console.log(arr) // 输出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]

反向冒泡排序:

let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18]
for (let i = arr.length - 1; i >= 0; i--) {
  for (let j = arr.length - i - 1; j >= 0; j--) {
    if (arr[j] < arr[j - 1]) {
      exchangeNum(arr, j, j - 1)
    }
  }
}
console.log(arr) // 输出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]

js的冒泡排序算法可能在实际工作中并没有什么应用,实际工作中用的最多的是Array.prototype.sort(),因为相较于冒泡排序,他拥有更高的效率。但是面试的时候问冒泡排序原理的很多,可能他更像一个工具,可以帮我们更好的了解算法。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章