本文首发于我的个人博客
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
冒泡排序是最简单最暴力的排序方式,但是他在leetcode上执行是超时的。
冒泡的思想就是对比 i 和 i + 1,并排序 i 和 i + 1,从头到尾依次排序。并将这个动作重复 n 次。
冒泡的核心思想就是,设最外层遍历次数为m,每次将当前最大的放在nums.length - 1 - m 的位置上,这样重复n次,就能得到一个升序的数组。就是每次将最大的数冒出来,所以是冒泡排序
但是冒泡排序的缺点也很明显,时间复杂度过高。
简单冒泡排序代码:
function sortArray(nums: number[]): number[] {
for (let i in nums) {
for (let l = 0, r = 1; r < nums.length; ++l, ++r) {
if (nums[l] > nums[r]) {
let left = nums[l]
nums[l] = nums[r]
nums[r] = left
}
}
}
return nums
};
复杂度分析
时间复杂度:O( )。
空间复杂度:O( 1 )。
改进冒泡排序代码:
当我们知道了冒泡排序的特征,即每次将当前最大的放在nums.length - 1 - m 的位置上。所以我们可以每次遍历时,少遍历一部分。
并且,我们可以设置一个标志位,如果本次排序没有任何元素变动,说明顺序已经排好了。直接返回即可。
function sortArray(nums: number[]): number[] {
for (let i in nums) {
let flag: boolean = true;
for (let l = 0, r = 1; r < nums.length - parseInt(i); ++l, ++r) {
if (nums[l] > nums[r]) {
let left = nums[l]
nums[l] = nums[r]
nums[r] = left
flag = false
}
}
if (flag){
return nums
}
}
return nums
};
复杂度分析
时间复杂度:O( )。
- 在最好的情况下,即数组都是正序的时候,第一次遍历就结束了,时间复杂度是 O(n)。
- 在最坏的情况下,数组是倒序时,第一次遍历需要n次,第n次遍历需要一次,时间复杂度是 O( )。
空间复杂度:O( 1 )。