一以贯之的努力,不得懈怠的人生。——长洱《天才基本法》
冒泡排序(Bubble Sort)
它会遍历 数据总个数减一 次需要排序的数列,
每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置(也可能反之,根据需求)。
这样,一次遍历之后,最大的元素就在数列的末尾!
采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。
重复此操作,直到整个数列都有序为止!
时间复杂度
什么时候最快?
当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊)。
最好情况:O(N)
什么时候最慢?
当输入的数据是反序时(写一个 for 循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗)。
最坏情况:O(N^2)
空间复杂度
空间复杂度:O(1)
平均时间复杂度计算
比较次数是
(n-1) + (n-2) + (n-3) +.....+ 1 = n(n-1)/2
JS代码实现
function bubbleSort(arr) {
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]) { // 相邻元素两两对比
let temp = arr[j+1]; // 元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
带上冒泡刷LeetCode
题目
非递减顺序,即非严格递减,可能存在相邻元素相等的情况。
使用冒泡(简单易手写)解题
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {
//合并数组
for(let i = 0; i < n; i++){
nums1[m+i] = nums2[i]
}
//外层循环,控制趟数,每一次找到一个最大值
for (let i = 0; i < nums1.length - 1; i++) {
// 内层循环,控制比较的次数,并且判断两个数的大小
for (let j = 0; j < nums1.length - 1 - i; j++) {
//如果前面的数大,放到后面(当然是从小到大的冒泡排序)
if (nums1[j] > nums1[j + 1]) {
let temp = nums1[j];
nums1[j] = nums1[j + 1];
nums1[j + 1] = temp;
}
}
}
};
顺利通过。
我是capybara,你的编程学习伙伴,欢迎留言讨论和点赞支持。