冒泡排序——排序算法


前言

打工人的周末从周日中午开始,工作找到了,可是就像从一个舒适圈跳到另一个舒适圈(我室友说的๑Ő௰Ő๑)。所以为了改变这个现状,也为了不被舍友安排的明明白白,我还是老老实实的写博客来记录自己学习进度吧。


一、什么是冒泡排序?

名字的由来:因为在升序排序中越小的元素会经由交换慢慢“浮”到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
学习计算机,第一门学习的基础语言,老师一定会讲到冒泡排序吧!不管你第一门是学的c、java还是JavaScript。只要你刚开始学习遇到需要排序的方法,最基础的也是每个程序员必会的就是冒泡排序了。这个排序方法实现思路很简单就是两两交换如果顺序不一致就调换位置,稍微聪明一点的同学应该都能想到,使用两个for循环来实现这个基本的算法。通过重复的访问元素列,只要顺序不对就交换,直到全部顺序一致了才停止交换。

二、算法描述

算法步骤:

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素使用1中的方法,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 重复步骤1~3,直到排序完成。

算法复杂度:

  • 时间复杂度:
    • 最好:O(n) 最好的情况是待排序的数列是已经期望的序列不用排序
    • 平均:O(n2)
    • 最坏:O(n2) 最坏的情况就是与最好相反,反序列每次都要交换
  • 空间复杂度:O(1)
  • 稳定性:稳定

三、JS代码实现

懂前端的同学打开控制台(chrome按F12键,现在好像都是f12吧)复制下面代码粘贴到控制台回车就可以运行看到结果了。(๑′ᴗ‵๑)
代码如下(示例):

//JS代码实现
function maopao(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 tmp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
let ary = [9, 8, 7, 6, 5, 4, 3, 2, 1];
maopao(ary)
console.log(ary);

总结

其实现在还是有一点点的迷茫,不知道该何去何从,对写代码这件事不排斥,但是也说不上那么喜欢,因为一个开源项目都没有,之前被面试官问到这句话,既然喜欢学习前端那有什么开源的前端项目吗?一时语塞,在进入公司前虽然有学习过git也使用过几次,但是也许久没有使用过了,一方面是英语上不行,另一方面就是“思想上的巨人,行动上的矮子”,这句话来描述我再合适不过了,总是想着要做很多,却都没有开始动手,想清楚再去做,好像慢慢的就不会做了,所以任何事都适合直接开始,万事俱备再去做就真的迟了,学习这方面我一直都是看视频加上搞项目,也多亏在实验室有老师带我做项目,也前前后后学习了不少东西,如今才能勉强找到个实习工作,今后还是务必要继续努力,学习的东西太少,而自己的知识又撑不起自己的野心,只能静下心来好好学习,写到这里我到思维是一团乱麻,明天还要上班,总结起来就是学习吧!希望以后自己不光是嘴上一个劲的说,也要实际行动起来,加油!

—— 2020.12.20 23:50 一个即将成为北漂人的独白

今日份励志名言:

“弱小和无知不是生存的障碍,傲慢才是。”
——(刘慈欣 《三体III》)

冒泡排序是一种简单的排序算法,它重复地遍历待排序的元素,比较相邻元素的大小,如果顺序错误就交换它们,直到没有需要交换的元素为止。下面是冒泡排序的C语言实现: ```c void bubbleSort(int arr[], int n) { for(int i = 0; i < n-1; i++) { int flag = 0; //是否冒泡 for(int j = 0; j < n-1; j++) { if(arr[j > arr[j+1]) { swap(&arr[j], &arr[j+1]); flag = 1; } } if(flag == 0) { //如果没有发生交换,说明数组已经有序,可以提前结束循环 break; } } } ``` 在这个实现中,冒泡排序函数`bubbleSort`接受一个整型数组`arr`和数组长度`n`作为参数。它使用两层循环来遍历数组,并通过比较相邻元素的大小来进行交换。内层循环每次将最大的元素冒泡到数组的末尾。外层循环控制了冒泡的轮数,每一轮都会将当前未排序的最大元素放在正确的位置上。如果在某一轮的冒泡过程中没有发生交换,说明数组已经有序,可以提前结束循环,从而提高算法的效率。 需要注意的是,上述代码中使用了一个`swap`函数来交换两个元素的值,你可以根据需要自行实现该函数。此外,为了减少冒泡排序的时间复杂度,可以在内层循环中添加一个标志位`flag`,用于标记是否发生了交换。如果某一轮的冒泡过程中没有发生交换,说明数组已经有序,可以提前结束循环。这样可以避免不必要的比较和交换操作,提高排序的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZERO丶X

托马斯回旋360°飞旋感谢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值