排序算法(一)冒泡排序

194 阅读2分钟

本文首发于我的个人博客

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

冒泡排序是最简单最暴力的排序方式,但是他在leetcode上执行是超时的。

冒泡的思想就是对比 ii + 1,并排序 ii + 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( n2n^2 )。

空间复杂度: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( n2n^2 )。

  • 在最好的情况下,即数组都是正序的时候,第一次遍历就结束了,时间复杂度是 O(n)。
  • 在最坏的情况下,数组是倒序时,第一次遍历需要n次,第n次遍历需要一次,时间复杂度是 O( n2n^2 )。

空间复杂度:O( 1 )。