一起来学C语言———C语言之冒泡排序和选择排序
Posted 爱诺特机器人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起来学C语言———C语言之冒泡排序和选择排序相关的知识,希望对你有一定的参考价值。
在C语言中,冒泡排序和选择排序都是比较经典的排序算法,经常被用来当作应聘软件工程师的笔试题,我们现在就拿一个例子来简单介绍下两种算法。
eg. 对整数序列 | 6 | 8 | 3 | 2 | 5 | 7 | 按照从小到大的顺序进行重新排列,排序后的序列为: | 2| 3 | 5 | 6| 7| 8 |
第一种方法:冒泡排序法
冒泡排序法的原理是:临近的数字两两比较,按照从大到小或者从小到大的顺序进行交换,这样一趟过去后,最小或者最大的数字就被交换到了最后一位,然后再从头开始临近两数字比较交换,直到比较到倒数第二位,这样次小或次大的数字就被交换到了倒数第二位,以此循环,直到最后所有数据都比较交换完,这种算法就像小数/大数下沉,大数/小数上浮一样,故名冒泡法。
就以上面那个例子来说:
第一趟排序:
第一次两两比较:(6,8比较;6<8,所以不交换)
排序前:| 6 | 8 | 3 | 2 | 5 | 7 |
排序后:| 6 | 8 | 3 | 2 | 5 | 7 |
第二次两两比较:(8,3比较;8>3,所以交换)
排序前:| 6 | 8 | 3 | 2 | 5 | 7 |
排序后:| 6 | 3 | 8 | 2 | 5 | 7 |
第三次两两比较:(8,2比较;8>2,所以交换)
排序前:| 6 | 8 | 3 | 2 | 5 | 7 |
排序后:| 6 | 3 | 2 | 8 | 5 | 7 |
第四次两两比较:(8,5比较;8>5,所以交换)
排序前:| 6 | 8 | 3 | 2 | 5 | 7 |
排序后:| 6 | 3 | 2 | 5 | 8 | 7 |
第五次两两比较:(8,7比较;8>7,所以交换)
排序前:| 6 | 8 | 3 | 2 | 5 | 7 |
排序后:| 6 | 3 | 2 | 5 | 7 | 8 | ----------------------------沉下数据8
第二趟排序:
第一次两两比较:(6,3比较;6>3,所以交换)
排序前:| 6 | 3 | 2 | 5 | 7 | 8 |
排序后:| 3 | 6 | 2 | 5 | 7 | 8 |
第二次两两比较:(6,2比较;6>2,所以交换)
排序前:| 3 | 6 | 2 | 5 | 7 | 8 |
排序后:| 3 | 2 | 6 | 5 | 7 | 8 |
第三次两两比较:(6,5比较;6>5,所以交换)
排序前:| 3 | 2 | 6 | 5 | 7 | 8 |
排序后:| 3 | 2 | 5 | 6 | 7 | 8 |
第四次两两比较:(6,7比较;6<7,所以不交换)
排序前:| 3 | 2 | 5 | 6 | 7 | 8 |
排序后:| 3 | 2 | 5 | 6 | 7 | 8 |----------------------------沉下数据7
第三趟排序:
第一次两两比较:(3,2比较;3>2,所以交换)
排序前:| 3 | 2 | 5 | 6 | 7 | 8 |
排序后:| 2 | 3 | 5 | 6 | 7 | 8 |
第二次两两比较:(3,5比较;3<5,所以不交换)
排序前:| 2 | 3 | 5 | 6 | 7 | 8 |
排序后:| 2 | 3 | 5 | 6 | 7 | 8 |
后面第三次两两比较:(5,6比较;5<6,所以不交换)
排序前:| 2 | 3 | 5 | 6 | 7 | 8 |
排序后:| 2 | 3 | 5 | 6 | 7 | 8 |----------------------------沉下数据6
第四趟排序:
第一次两两比较:(3,2比较;3>2,所以交换)
排序前:| 2 | 3 | 5 | 6 | 7 | 8 |
排序后:| 2 | 3 | 5 | 6 | 7 | 8 |
第二次两两比较:(3,5比较;3<5,所以不交换)
排序前:| 2 | 3 | 5 | 6 | 7 | 8 |
排序后:| 2 | 3 | 5 | 6 | 7 | 8 |----------------------------沉下数据5
第五趟排序:
第一次两两比较:(2,3比较;2<3,所以不交换)
排序前:| 2 | 3 | 5 | 6 | 7 | 8 |
排序后:| 2 | 3 | 5 | 6 | 7 | 8 |----------------------------沉下数据3
依照上面的思路写程序代码如下:
运行结果如下:
第二种方法:选择排序法
假设将原序列定义为一个6个元素的数组a[6], 所谓选择法就是先将6个数中最小的数与a[0]对换;再将a[1]到a[5]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个 ,找最小数的时候只是将数组标号记录下来,不进行数据交换。
还是上面那个例子,我们来看选择法是什么思路。
第一趟排序:
第一次比较:(6,8比较;6<8,所以不记标号)
排序前后:| 6 | 8 | 3 | 2 | 5 | 7 |
第二次比较:(6,3比较;6>3,所以记下“3”数字的标号k=2)
排序前后:| 6 | 8 | 3 | 2 | 5 | 7 |
第三次比较:(3,2比较;3>2,所以记下“2”数字的标号k=3)
排序前后:| 6 | 8 | 3 | 2 | 5 | 7 |
第四次比较:(2,5比较;2<5,所以依旧k=3)
排序前后:| 6 | 8 | 3 | 2 | 5 | 7 |
第五次比较:(2,7比较;2<7,所以依旧k=3)
排序前后:| 6 | 8 | 3 | 2 | 5 | 7 |
然后将a[3]数据与a[0]数据交换,即:
排序前:| 6 | 8 | 3 | 2 | 5 | 7 |
排序后:| 2 | 8 | 3 | 6 | 5 | 7 |
第二趟排序:
第一次比较:(8,3比较;8>3, 所以记下“3”数字的标号k=2)
排序前后:| 2 | 8 | 3 | 6 | 5 | 7 |
第二次比较:(3,6比较;3<6,所以依旧k=2)
排序前后:| 2 | 8 | 3 | 6 | 5 | 7 |
第三次比较:(3,5比较;3<5,所以依旧k=2)
排序前后:| 2 | 8 | 3 | 6 | 5 | 7 |
第四次比较:(3,7比较;3<7,所以依旧k=2)
排序前后:| 2 | 8 | 3 | 6 | 5 | 7 |
然后将a[2]数据与a[1]数据交换,即:
排序前:| 2 | 8 | 3 | 6 | 5 | 7 |
排序后:| 2 | 3 | 8 | 6 | 5 | 7 |
第三趟排序:
第一次比较:(8,6比较;8>6, 所以记下“6”数字的标号k=3)
排序前后:| 2 | 3 | 8 | 6 | 5 | 7 |
第二次比较:(5,6比较;5<6,所以记下“5”数字的标号k=4)
排序前后:| 2 | 3 | 8 | 6 | 5 | 7 |
第三次比较:(7,5比较;5<7,所以依旧k=4)
排序前后:| 2 | 3 | 8 | 6 | 5 | 7 |
然后将a[4]数据与a[2]数据交换,即:
排序前:| 2 | 3 | 8 | 6 | 5 | 7 |
排序后:| 2 | 3 | 5 | 6 | 8 | 7 |
第四趟排序:
第一次比较:(8,6比较;8>6, 所以记下“6”数字的标号k=3)
排序前后:| 2 | 3 | 5 | 6 | 8 | 7 |
第二次比较:(7,6比较;6<7,所以依旧k=3)
排序前后:| 2 | 3 | 5 | 6 | 8 | 7 |
没有数据交换。
第五趟排序:
第一次比较:(8,7比较;8>7, 所以记下“7”数字的标号k=5)
排序前后:| 2 | 3 | 5 | 6 | 8 | 7 |
第二次比较:(7,6比较;6<7,所以依旧k=5)
排序前后:| 2 | 3 | 5 | 6 | 8 | 7 |
然后将a[5]数据与a[4]数据交换,即:
排序前:| 2 | 3 | 8 | 6 | 5 | 7 |
排序后:| 2 | 3 | 5 | 6 | 7 | 8 |
依照上面的思路写程序代码如下:
运行结果如下:
以上是关于一起来学C语言———C语言之冒泡排序和选择排序的主要内容,如果未能解决你的问题,请参考以下文章