排序算法之冒泡排序
1. 常见排序算法的时间复杂度:
- 时间复杂度为 O(N ^ 2) 的有:选择排序、冒泡排序、插入排序
- 时间复杂度为 O(N * log N) 的有:归并排序、快速排序
- 时间复杂度为O(N * log N)的算法比时间复杂度为 O(N ^ 2)的算法好的多
- 时间复杂度就相当于数组的长度N与执行时间的关系
- 时间复杂度的表示,按算最坏的情况看,而且忽略常数时间(执行时间确定的时间)
- 算法的时间复杂度表示相同,它的区别是常数时间不同,但要排序的数组长度很长时,常数时间的影响可以忽略不计
2. 冒泡排序
排序过程:
- 在arr[0 ~ N-1]范围上(N表示数组长度):
- arr[0]和arr[1]谁大谁的位置就到1,arr[1]和arr[2]谁大谁的位置就到2,… ,arr[N-2]和arr[N-1]谁大谁位置就在N-1。这样遍历一遍就可以将范围中最大的数放到最后。
- 在arr[0 ~ N-2]范围上(相对上一步末尾范围-1):
- 重复上一步的过程,最后一步是arr[N-3]和arr[N-2],谁大谁往后。
- …
- 最后在arr[0~1]的范围上,重复上面的过程,谁大就谁在1的位置
- 每一步的范围都在缩小,因为每遍历一遍就能将范围内的最大数排到最后,所以这个最大数后续没有必要再遍历
代码实现(JavaScript):
function bubbleSort(arr) {
// 对传入的参数进行判断
if (!Array.isArray(arr) || arr.length < 2) {
return arr
}
// 遍历数组每一项,并逐步缩减范围
for (let i = arr.length - 1; i > 0; i--) {
// 从第一项开始,不断向后对比并移动,如果前一项比后一项大则交换位置,直到遍历到范围末尾
for (let j = 0; j < i; j++) {
// 元素位置交换
if (arr[j] > arr[j + 1]) {
let tmp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = tmp
}
}
}
// 返回结果
return arr
}