C语言学习之交换(冒泡)排序
在学习c语言的过程中,在数组内容中我们总是能学习到对一组数据进行排序,对于排序有许多的方法,像 (交换)冒泡排序、选择排序、(基数)桶排序、(插入)二分法排序等等。
我主要以我个人的理解去分析常见的交换(冒泡)排序,同时本人也是个新手,希望能以我的手笔让其他不懂的新手了解透这些排序。
交换(冒泡)排序:
又名为冒泡排序,即像水中的气泡一样冒出来,在数组中数组往一端移动可以形象说是冒泡,顾名思义啦。
下面就以 4 6 32 5 12 2 15 28 9 10 这10个数字为例,我们可以从小到大排序也可从大到小排序,原理都是一样的。现就以从小到大排序为例。
如下图、开始依次对相邻两个数进行比较,如果符合条件(此处从小到大排序,则是如果前一个数大于后一个数,那么这两个数字进行值的交换,否则保持值不变)则执行相应的操作。从图中可以看出两数比较最大的那个数就往后移(往后冒),这第一趟下来,最大的数就出来了,冒在数组的末端。那么就剩下前面的九个数进行两两比较了,相同的方式就可以依次找出第二大的数、第三大的数……这样进行九趟比较,这组数据排序就好了。
代码如下 :
#include"stdio.h"
int main(void)
{
int i, j;
int temp;//临时变量
int a[10] = {4, 6, 32, 5, 12, 2, 15, 28, 9, 10};
for(i = 9; i >= 0 ; i--)
for(j = 0; j <= i; j ++)
if(a[j] > a[j + 1]){//满足条件则交换两值
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
for(i = 0; i < 10;i ++)
printf("%d ",a[i]);
}
众所周知,几乎任何事物都有两面性,好与坏、利与弊。
那么这种排序的弊端,相信大家从上图应该看出来了。在第五趟的时候整个数组是排序好了,但是呢程序还是往下执行。这样不仅浪费时间,还占用空间(虽然现在计算机的空间大、运算速度也快)。同时这种方法在处理大量数据时可能吃不消,这里只是10组数,就要比较9 趟。当然这个是可以进行优化的,我们可以加入一个标示 flag 如果在之前的比较中进行了数值的交换则说明顺序还没有排好那么继续进行,否则就说明已经排序了,这里就可以 break 了。
代码如下:
#include"stdio.h"
int main(void)
{
int i, j;
int temp, flag = 0;//标志 flag 赋值为 0
int a[10] = {4, 6, 32, 5, 12, 2, 15, 28, 9, 10};
for(i = 9; i >= 0 ; i--){
for(j = 0; j <= i; j ++)
if(a[j] > a[j + 1]){
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag ++;//如果进行了值的交换则改变标志flag的值
}
if(flag == 0)
break;//如果标志flag的值未变化,则说明已经排序好,那么就可以终止了
flag = 0;//重置flag 值以进行下一趟比较
}
for(i = 0; i < 10;i ++)
printf("%d ",a[i]);
}
当然,这种排序方式的优点就是稳定,不管有多少数组,只要给定足够空间和时间,就能完整无误地排序好。如果数据足够大的话还是不怎么推荐此排序方法。以上代码中简单以10个数为例对其进行排序,你可以依葫芦画瓢变更一下代码中变量就可以了。
本人新手,希望本篇文章能对你有所帮助,如有疑问、错误、更好的思路可进行留言评论。最后感谢你能在成千上万的文章中浏览到此篇 ^-^