背景知识
冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,并根据需要交换它们的位置。这个算法的名称就来源于它对于像气泡一样不断向上升的元素的排序过程。它是一种基础的排序算法,但由于它的时间复杂度较高,通常只用于小型数据的排序。
原理介绍
-
首先,从列表的第一个元素开始,比较相邻的两个元素。如果第一个元素比第二个元素大,则交换它们的位置。否则,它们保持不变。
-
接着,继续比较第二个和第三个元素,如果第二个元素比第三个元素大,则交换它们的位置。否则,它们保持不变。
-
重复以上步骤,直到最后一个元素。这样一次遍历后,列表中最大的元素就会被移到了最后一个位置。
-
然后再次重复以上步骤,但是这次只需要遍历到倒数第二个元素,因为最后一个元素已经是最大的了。
-
重复以上步骤,每次遍历时减少一个元素,直到没有任何一对相邻的元素需要交换位置。
-
最终,列表就被排好序了。
冒泡排序的时间复杂度为O(n^2),其中n为要排序的元素个数。虽然这个算法的效率不是很高,但是它非常简单易懂,而且可以在一些特殊情况下发挥出比较好的效果。
需要注意的是,冒泡排序的稳定性非常好,因为它只会比较相邻的元素,不会改变相同元素的相对位置。同时,由于它是一种原地排序算法,所以不需要额外的存储空间。
总之,冒泡排序虽然效率不高,但是它是一种简单易懂的排序算法,对于小规模的数据排序是非常实用的。
代码实现
let arr = [19,5,53,24,35,7,1,0,13]
let temp = null // 临时变量
// 冒泡排序法:升序
for(let i = 1;i <= arr.length - 1;i++){
// 每次遍历后最后一个元素已经排好序,无需再比较
for(let j = 0;j < arr.length-i;j++){
// 如果前一个元素比后一个元素大,则交换它们的位置
if(arr[j] > arr[j+1]){
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
// 升序后数组arr = [0,1,5,7,13,19,24,35,53]
// 冒泡排序法:降序
for(let i = 1;i <= arr.length - 1;i++){
// 每次遍历后最后一个元素已经排好序,无需再比较
for(let j = 0;j < arr.length-i;j++){
// 如果前一个元素比后一个元素小,则交换它们的位置
if(arr[j] < arr[j+1]){
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
// 降序后数组arr = [53,35,24,19,13,7,5,1,0]