如此简单的冒泡排序,我居然不知道这个原理?

引言

算法,是大多数小白的噩梦。它时常让众多小白们琢磨不透。对于初学者来说,即使是最基础的算法,也要转很久的弯才能绕过来,但是过了几天,又遗忘得差不多。当老师布置一道算法题的时候……
甲:今天怎么又要写算法了?
乙:这什么破题!码字10分钟,调试一小时。
丙:大神救我!算法题鲨我!!!
丁:真是一窍不通,选错专业了呜呜呜。
在这里插入图片描述
但是,无论算法有多么难,都要保持着一颗真诚的心。
算法虐我千百遍,我待算法如初恋。
在做算法题的时候,你的表情应该是这样子的。
在这里插入图片描述
在跟同学一起交流学习的时候,是不是经常发现,自己好不容易研究出一道算法题跟同学分享后,瞬间逼格满满。
当同学们看到你的运行结果后……
在这里插入图片描述
但是,做出一道算法题并不说明你很厉害。
殊不知,这才是身经百战的算法大佬!
在这里插入图片描述
咳咳咳,废话说多了,言归正传,现在教教大家如何实现数组排序!这种算法是展现逼格的第一层内功!

一、实现原理详解

原理暂时先不多说,一张 gif 图先干为敬!看看能不能理解!
在这里插入图片描述
大家看出来了吗?
比如说有一组数组20 10 15 30 12
我们要把它从小到大排列,如果抛开代码实现的话,怎么排序?大家可以在纸上手写感受一下!
步骤如下:
(1)第一轮比较
①20 和 10 比较,即第一个和第二个比较,显然第二个更小,我们就把10放在前面,20放在后面。
这样原来的数组就变成 10 20 15 30 12
②20 和 15 比较,即第二个和第三个比较,显然15更小,把15放在20前面。
这样原来的数组就变成 10 15 20 30 12
③20 和 30 比较,即第三个和第四个比较,显然20更小,20位置就不用变了。
这样数组还是 10 15 20 30 12
④30 和 12 比较,即第四个和第12个比较,显然12更小,把12放在30前面。
这样数组变为 10 15 20 12 30

看到没,步骤①到步骤④遍历了所有的数,每次都把相邻的数进行比较和交换。这是第一轮比较!

(2)第二轮比较:重复第一轮比较的步骤
最终所得数组为 10 15 12 20 30
仔细看看,嗯,还是没完成从小到大排列,继续继续!
(3)第三轮比较:重复第一轮比较的步骤
最终所得数组为 10 12 15 20 30
哈哈哈,发现了没,它现在已经是从小到大排列了!

二、代码实现详解

接下来,装逼的时刻到了,我们要把冒泡排序算法用C语言代码来实现!
在这里插入图片描述
不懂的同伴,可以一边看讲解,一边对应代码。
冒泡排序代码详解:第⑤步是冒泡排序的关键。源码下滑可得
①main()函数进入程序,首先是声明i,j,t,这三个变量刚开始看的时候可能没看懂,先跳过
②又声明了一个数组a,长度为10
③关键来了,srand()函数是啥东西?它存在于<stdlib.h>头文件中,定义为void srand(unsigned int seed),在本程序中seed对应time(0),用来初始化随机数发生器,简单地来说,在进行任何取随机数操作之前,都要有**srand()**函数的调用。
④分别给数组中的每个数赋予随机值并打印,随机值的范围在60~100之间
60~100在代码中要写成60+40*rand()/RAND_MAX

for(i=0;i<10;i++){
		a[i]=(int)(60+40*rand()/RAND_MAX);
		printf("%5d",a[i]);
	}

⑤第五步是是冒泡排序的核心
我不知道大家是否能看懂这段代码,但是实现冒泡排序的排序过程,确实只要这一段代码足以。
for(i=0;i<9;i++):
for(j=0;j<9-i;j++)
冒泡排序的实现要用两个for的嵌套循环
比如有一个长度为10数组,要进行9轮的排序,每轮都遍历所有数,这是 i<9 的含义;
细心的朋友会发现,每进行一轮排序之后,下一轮排序的次数就减少了一次,这是就是 j<9-i 的由来
在长度为10的数组中,第一轮排序排列 9 次,第二轮排序就排8次,依次类推,第9轮排序只排一次
在冒泡排序中,一个数组排序的轮数永远是
其长度的值减去1

if(a[j]>a[j+1]){
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}

相邻两个数,若前一个数大于后一个数,则两个数的值进行置换!

⑥输出冒泡排序后的数组


for(i=0;i<9;i++)
		for(j=0;j<9-i;j++)
		if(a[j]>a[j+1]){
			int t;
			t=a[j];
			a[j]=a[j+1];
			a[j+1]=t;
		}

三、冒泡排序完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	int i,j,t;
	int a[10];
	srand((int)time(0));
	printf("The score of the singers:\n");
	for(i=0;i<10;i++){
		a[i]=(int)(60+40*rand()/RAND_MAX);
		printf("%5d",a[i]);
	}
	printf("\n");
	for(i=0;i<9;i++)
		for(j=0;j<9-i;j++)
		if(a[j]>a[j+1]){
			int t;
			t=a[j];
			a[j]=a[j+1];
			a[j+1]=t;
		}
	printf("The sorted scores:\n");
	for(i=0;i<10;i++)
		printf("%5d",a[i]);
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叶叶扁舟

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值