一起来学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

依照上面的思路写程序代码如下:

一起来学C语言———C语言之冒泡排序和选择排序


运行结果如下:

                                    一起来学C语言———C语言之冒泡排序和选择排序

第二种方法:选择排序法

假设将原序列定义为一个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语言之冒泡排序和选择排序

运行结果如下:

            

                                       

                                  




以上是关于一起来学C语言———C语言之冒泡排序和选择排序的主要内容,如果未能解决你的问题,请参考以下文章

C语言之冒泡排序

C语言冒泡排序法

冒泡排序和选择排序(C语言)

初识C语言之冒泡排序

初识C语言之冒泡排序

C语言冒泡排序。