这章咱们来填上一章的坑,如果仅仅是对数字排序的话,桶排序是我认为最方便的排序算法,可是在我们不清楚要对什么数字排序的情况下贸然使用桶排序,很有可能造成空间的浪费,具体原因可以参考上一节。话不多说,咱们直接进入主题。
问题1:什么是冒泡排序
对于冒泡排序,官方有自己的解答(解答来自于百度搜索):
如果我直接摆上这张图片那么就失去了写这篇文章的意义,接下来我会举个简单的例子来引导大家去理解冒泡排序,首先我们先引入一个小故事。
在很久很久以前,有一群很聪明的猿人外出狩猎,这天他们很幸运,捕获到了一只巨大的猎物(具体是啥猎物大家自己想象),但是面对猎物的分配却犯了难,因为猿人们的猎物分配是要看这个人在工作的过程中出了多少力,便能获得多少报酬,但是这次狩猎的过程中大家都很卖力,但都不记得别人出了多少力,便一致认为谁的个子高谁出的力就多,这也是合理的推论,可是人数太多,当时没有数学,大家都不知道自己多高,这可怎么办呢?这时候首领提出了一个办法,他先让所有的猿人随机排成一列,他从左边第一个猿人开始让他和旁边的猿人比身高,如果第一个猿人身高比第二个猿人身高高,则他俩互相交换位置,然后他再和之后的人比较,直到遇到比自己高的人猿停下,再从更高的人猿开始往后比较,直到第一次比较到最后,是不是最高的猿人就出来了,这时候最高的猿人领完属于自己那份的猎物就可以离开不用参与比较了,然后从左边第一个猿人按照这个规则继续排列。
最后完成排列的所有猿人都领取了属于自己的那份猎物。(可怜的首领忙着排列族人忘记算上自己了)。
问题二:具体代码
#include<stdio.h>
int main(void)
{
int n;
scanf_s("%d", &n);//先决定一共有多少猿人
int i;
int arr[100];//假设最多有100个猿人
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);//从左到右输入猿人的身高
for(i = 0;i<n-1;i++)//表示有几个已经排列结束,不需要再参与排列的猿人。
for (int j = 0; j < n - i - 1; j++)//最后的i个人已经比较完毕,不用参与比较
if (arr[j] > arr[j + 1])
{
int t = arr[j + 1];//准备t记录arr[j+1],因为下一行arr[j+1]会被覆盖掉。
arr[j + 1] = arr[j];//以下两行交换两个猿人的位置。
arr[j] = t;
}
for (i = 0; i < n; i++)
printf("%d ", arr[i]);//输出验证。
return 0;
}
如图第一二行是输入,第三行是输出。
问题三:可能存在的疑问
看到现在,可能刚入门的同学想一句话弄清冒泡排序的内涵,我自认为冒泡排序如果升序排列,就是每次第一层循环先挑选出最大的数,然后第二层循环挑出第二大的数......(降序相反)。
那么还记得我上一章暗示过冒泡排序不仅可以排列数字,还能知道对应位置的事物,比如以本篇故事为例,在第2个位置的猿人是谁。这时候我们可以事先定义结构体变量,结构体内部包含身高,姓名 。然后定义结构体数组,用结构体内部的身高属性来进行排列是不是就可以了,就当留个小作业,大家自己试试。
在现实生活中排序的作用很大,希望同学们能够掌握,排序的相关内容我们以后还会讲到,比如快速排序等,不过作为新手,掌握这两中基本的排序就够了,下次我们会带来有关排序的题目。