冒泡排列的作用
冒泡排序的作用就是把一串无序排列的数字转化为有序排列的数字!
冒泡排序原理
我们先来讲解一下冒泡排序的原理
先请不了解冒泡排序的同学花几分钟时间看下这张动图:
上图就是接下来我要讲解的升序
升序:就是按照从左到右依次增大的顺序对一组无序数列进行有序排列。
例如下面五个无序排列的数字:
12 -23 15 4 7
如果要将这五个数字按照升序有序排列
那先要进行的是将相邻的的数字依次两两比较
第一轮比较:
12 > -23
则12 、-23互换位置
得到如下顺序:
-23 12 15 4 7
继续比较
12 < 15
此步较大的数15本来就在高位上,则数字位置不变,
继续比较,比较 上一步中较大的数
15 > 4
则有
-23 12 4 15 7
继续比较
15>7
变成
-23 12 4 7 15
这时我们发现这组无序数字中最大的数15,到达最右边的位置,即到达最高位
第二轮比较:
-23 < 12 //位置不变
12 > 4
变为
-23 4 12 7 15
继续比较
12 > 7
变为:
-23 4 7 12 15
可以发现,此时得到一组为升序的有序数列,不需要继续比较,否则继续进行下一轮比较
以上就是冒泡序列的进程原理,可以试着通过原理将代码打出来
大家可以发现它的原理只是重复执行一个命令(就是不断比较大小,互换位置)
我们接下来用代码来运行一下
#include <stdio.h>
int main(int argc, const char * argv[])
{
int a[] = {12,-23,15,4,7};
int n; //存放数组a中元素的个数
int i; //比较的轮数
int j; //每轮比较的次数
int buf; //交换数据时用于存放中间数据
n =sizeof(a[n]); /*sizeof即输出后面数组a[n]的容量(数字个数)*/
for (i=0; i<=n-1; ++i) //两两进行比较,需要比较n-1轮
{
for (j=0; j<n-i; ++j) /*每轮比较n-i次,意为每次排序后不用去管已经排完的数了,就是n-i*/
{
if (a[j] > a[j+1]) //如果数组中第j项大于第j+1项,进行if运算
{
buf = a[j]; //将a[j]数列赋给buf
a[j] = a[j+1]; //将a[j+1]数列赋给a[j]
a[j+1] = buf; //将buf赋给a[j+1]
}
}
}
for (i=0; i<=n; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
}
运行结果如下:
可以看见成功运行,并按照升序排列
有的同学可能会对下面这段代码有些疑问
这里也正是完成置换的关键所在
if (a[j] > a[j+1]) //如果数组中第j项大于第j+1项,进行if运算
{
buf = a[j]; //将a[j]数列赋给buf
a[j] = a[j+1]; //将a[j+1]数列赋给a[j]
a[j+1] = buf; //将buf赋给a[j+1]
}
这段代码其实就是将数值交换位置的过程代码
我们来细讲一下:
if (a[j] > a[j+1])
这个意思就是,如果第 j 个数大于第 j+1 个数
换个说法就是,如果第 j 个数大于它右边(升序中)那个数
{
buf = a[j];
a[j] = a[j+1];
a[j+1] = buf;
}
上面这段代码意思就是将数组中的第 j 项存于 buf 中,而将第 j+1 项换到第 j 项上,再将 buf 置换到第j+1项,也就是数组中的第 j 项换到第j+1项上去。
以上就是大小值置换的过程!
1.大家也不妨试着改成降序的方式来排列这串无序数组,即从左到右依次减小的顺序
2.大家也可以将这个代码改为动态代码,比如说自己可以随便定义数组(就是在代码的原基础上增加 scanf )的值并求顺序,使这段固定的代码可以拥有计算器的功能