引言
算法,是大多数小白的噩梦。它时常让众多小白们琢磨不透。对于初学者来说,即使是最基础的算法,也要转很久的弯才能绕过来,但是过了几天,又遗忘得差不多。当老师布置一道算法题的时候……
甲:今天怎么又要写算法了?
乙:这什么破题!码字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;
}