算法入门系列 冒泡排序 小白也能看懂 动态图解(1/10)

目录

前言

1.冒泡排序简介

1.1.什么是冒泡排序

1.2.冒泡排序的名称由来

2.冒泡排序的实现过程

2.1.原理图解

2.1.1.冒泡执行模拟第一轮图解

 2.1.2.冒泡执行模拟第二轮图解

2.1.3.冒泡执行模拟第三轮图解

2.2思考问题

2.2.1.我们会不会有第四轮?

2.2.2.如果第一轮就排序完成还会继续执行吗?

2.2.3.如何在程序中优化这个问题?

2.3代码实现

2.3.1.定义数组并传入我们的冒泡排序函数

2.3.2.冒泡排序函数的实现


作者想说

介于网上的排序算法文章大多都是死板的文字,本人文字理解能力一直不强。决定花时间做图解,把困难的问题变简单,把抽象的思维变具体。给想学习程序的小伙伴更好理解的文章资源。

文学家的浪漫是把一切用文字来书写,程序员的浪漫是把我们心中所想用代码书写

这里我将用图解来书写,程序在我脑子里的样子,我叫@张三xy,致力于写出优质作品的编程爱好者

1.冒泡排序简介

1.1.什么是冒泡排序

冒泡排序(Bubble Sort),是计算机科学与技术领域中较为简单的一种排序算法。

它重复地遍历要排序的序列,会依次比较两个相邻的元素,如果发现两个相邻的元素顺序错误就把它们交换过来。遍历序列的工作会重复地进行直到没有相邻的元素需要交换位置,也就是说序列的排序工作已经完成。

1.2.冒泡排序的名称由来

冒泡排序的算法名称的由来就是因为在排序的过程中,按照排序规则(升序或者降序),越小或者越大的元素会经过交换之后慢慢 “浮” 到序列的顶端,就如同水中的气泡一样最终会浮到顶端一样,所以起名为 “冒泡排序”。

2.冒泡排序的实现过程

2.1.原理图解

2.1.1.冒泡执行模拟第一轮图解

第一轮我们 j 指向 3下标时,就不会往后移动了

因为 j + 1刚好包含到了最后一个下标 4

因此我们第一轮最多遍历到 下标最大值 - 1

每轮排序后 这轮的最后一个值,一定是有序,下轮就不用管了

 2.1.2.冒泡执行模拟第二轮图解

 第二轮我们 j 指向 2下标时,就不会往后移动了

因为每轮排序后 这轮的最后一个值,一定是有序


因此第二轮的比较次数 下标最大值 - 1 - [已经排好的个数],前面累计1个 

2.1.3.冒泡执行模拟第三轮图解

        

第三轮我们 j 指向 1下标时,就不会往后移动了

因为每轮排序后 这轮的最后一个值,一定是有序


因此第三轮的比较次数 下标最大值 - 1 - [已经排好的个数],前面累计2个

2.2思考问题

2.2.1.我们会不会有第四轮?

答:一定有,会根据数据量,排序次数以n^2的程度上涨

2.2.2.如果第一轮就排序完成还会继续执行吗?

答:一定会,,会从 n - 1 ~ 0次,时间复杂度是O(n^2)

2.2.3.如何在程序中优化这个问题?

答:如果排序在某一轮中,一次没有进入交换条件里我们就知道它全部排序完成。

所以可以做个标记,如果一次没有进入交换条件,我们就终止这个程序。(优化思路)

2.3代码实现

2.3.1.定义数组并传入我们的冒泡排序函数

n表示数组长度

int main() {
   //自定义一个数组演示
   int n = 5;
   int a[] = {3,2,5,1,4};
   
   //传入我们的冒泡排序函数
   bubbleSort(a,n);
}

2.3.2.冒泡排序函数的实现

/**
 * 冒泡排序函数
 * @param a
 * @param len 数组长度
 * 时间复杂度:O(n^2)
 */
void bubbleSort(int a[],int len)
{
    int flag;
    for (int i = 0; i < len ; ++i)
    {
        flag = 1;//标记
        // 这里 -1是因为最后一个不需要比较
        //-i是因为,每轮最后一个值一定是有序的!
        for (int j = 0; j < len - i - 1; ++j)
        {
            if(a[j] > a[j+1])
            {
                flag = 0;//进入说明没有完成排序
                int tmp = a[j+1];
                a[j+1] = a[j];
                a[j] = tmp;
            }
        }
        if(flag)break;//如果一次 比较没有进入说明已经完成排序
    }
}

 以上就是我们 冒泡排序 的全部内容了,

走过路过的小伙伴们点点关注三连支持一下吧!

你们的支持就是我创作内容的最大动力!

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值