排序算法(1)----简单冒泡排序
本文章是本人基于学习《啊哈算法》以及其他相关文章之后,根据自己的理解创作的文章,如果有不正确的地方还希望各位可以指点。
在日常生活中,我们总是需要将一些物品进行排序,比如:我们在站队的时候需要按由高到低的(或者由低到高)的顺序进行排队;每次经历考试之后我们总需要将成绩进行排序等等;在日常中我们可以将数据输入电脑就可以进行自动排序,那么在电脑中我们该如何撰写一个这样的程序实现这种功能呢?下面我们将介绍一种方法,它就----简单冒泡排序!!
话不多说,直接上正文 !
简单冒泡排序基本思想
假设现在有n个数需要进行降序排序,我们从第一个数开始,将第一个数与第二个数进行比较,如果第一个数小于第二个数,就将第一个数和第二个数的位置进行交换(否则不进行交换);随后将第二个数与第三个数进行比较,若第二个数小于第三个数,就将第二个数与第三个数进行交换(否则不换),依次类推,直到第n-1个数与第n个数进行上述比较之后,第一轮比较结束,此时最小的数已经到达第n个位置;随后从头开始,将第一个数与第二个数进行比较。。直到第n-2个数与第n-1个数进行比较交换,此轮结束,第二小的数据已经到达n-1的位置;依次类推,直到最后完成降序排序。也就是说将n个数据进行排序需要进行n-1次操作。
具体案例
上面的讲解可能听完还不是很明白,下面我们通过具体案例来进行讲解:
假设现有一组数据12,15,20,23 现在我们需要将这组数据进行降序排序
第一轮:
(1)将12与15进行比较,发现12小于15,交换12与15的位置,此时排列为:
15 12 20 23
(2)将12与20进行比较,发现12小于20,交换12与20的位置,此时排列为:
15 20 12 23
(3)将12与23进行比较,发现12小于23,交换12与23的位置,此时的排列为:
15 20 23 12
第一轮结束,我们发现此时最小的数据12已经到达最后一个位置,随后开始新的一轮;
第二轮:
(1)将15与20进行比较,发现15小于20,交换15与20的位置,此时排列为:
20 15 23 12
(2)将15与23进行比较,发现15小于23,交换15与23的位置,此时排列为:
20 23 15 12
到这个时候,第二轮结束,最后两个数据不会进行比较,因为通过第一轮我们已经确定最小的数据放到了最后的位置,此一轮也将第二小的数据放在倒数第二个位置,随后开始新的一轮;
第三轮:
将20与23进行比较,发现20小于20,交换20与23的位置,此时排列为:
23 20 15 12
此时排序结束,我们想要降序排列一组数据已经达到目的。
注意:上述例子是属于升序排列变成降序排列,所以每一轮都有新的数据进行交换,在一些例子中可能会出现还没有完成n-1轮操作的时候就已经排好顺序,这个时候在计算机运行的时候仍然会继续下面没有完成的相关轮。是不是觉得这样的话一些排序完成后如果还要继续下去会更复杂,可以增加一个判断条件,在完成排序之后就停止,这样算法的时间复杂度更小,你们也可以自己思考思考哦,小编在下一篇文章中会对简单冒泡排序的优化版进行讲解哦!! 可以关注一下!
相信读到这里你已经对冒泡排序理解的差不多了,没错,使用嵌套循环就可以实现,不妨停下来自己思考一下代码实现再看下面的文章吧!(一定要想一想才可以哦,这样对自己才有帮助!!)
实现代码
#include<stdio.h>
int main()
{
printf("此代码实现的是降序排列!\n\n");
int i,j,t;
int m;
int a[100];
printf("请输入你想要在数组中加入多少数据:");
scanf("%d",&t); //表示你将要在数组中输入多少个数据
printf("输入防在数组中的数据:\n");
for(int l=0;l<=t-1;l++) //将数据存储至数组之中
{
scanf("%d",&a[l]);
}
for(i=t-1;i>=0;i--) //使用嵌套循环进行大小比较并进行数据交换
{
for(j=0;j<=i;j++)
{
if(a[j]<a[j+1])
{
m=a[j];
a[j]=a[j+1];
a[j+1]=m;
}
}
}
for(int n=0;n<=t-1;n++) //输出结果
{
printf("%d ",a[n]);
}
return 0;
}
当然代码实现方式也不止这一种,小编只是介绍自己编写的代码,你们也可以按照自己的来哦!
简单冒泡排序就介绍到这里了,小编第一次做类似文章的撰写,希望可以得到大家的支持哦!
大家一起加油学习吧!