冒泡排序(C语言)-解析

     排序算法是一种重要的、基本的算法。排序的方法有很多,在这里给大家讲解一下“冒泡法排序”。

“冒泡排序”的基本思路是:每次将相邻两个数比较,将小的调到前头(本例默认是按递增排列)。

若有6个数:9,8,5,4,2,0。

  第一次先将最前面的两个数 8 和 9 对调(见图1)。

  第 2 次将第 2 和第 3 个数( 9 和 5)对换……如此共进行5次,

    得到 8 - 5 - 4 - 2 - 0 - 9的顺序。

  可以看出:最大的数 9 已经“沉底”,成为最下面一个数,而小的数则“上升”。最小的数 0 已向上“浮起”一个位置。经过第一趟(共计5次比较与交换)后,

  已得到最大的数9。

  然后进行第 2 趟比较,对余下的前面 5 个数(8,5,4,2,0)进行新一轮的比较,

  以便使次大的数“沉底”。按以上方法进行第 2 趟比较,见图2。

  经过这一趟 4 次比较与交换,得到次大的数 8。

 

  按此规律进行下去,可以推出,对 6 个数要比较 5 趟,才能使 6 个数大小顺序排列。

  在第一趟中要进行两个数之间的比较共 5 次,在第 2 趟过程中比较 4 次……

  第 5 趟只需比较 1 次。

  由此推出,如果有 n 个数,则要进行 n - 1 趟比较。在第一趟比较中要进行 n - 1 次两两比较,在第 j 趟比较中要进行 n - j 次两两比较。

 再次分析排序的过程,原来 0 是最后一个数,经过第 1 趟比较与交换,0 上升为第 5 个数(最后第 2 个数)。再经过第 2 趟比较与交换,

0 上升为第 4 个数(最后第 3 个数)。再经过第 3 趟比较与交换,0 上升为第 3 个数……每经过一趟的比较与交换,最小的数“上升”一位,

最后升到第一个数。这如同水底的气泡逐步冒出水面一样,故称为“冒泡法”,或“起泡法”。

据此画出流程图(图3)(假设n = 10)

代码(c语言):

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[10];
 5     int i,j,t;
 6     printf("input 10 numbers :\n");//输入 
 7     for(i = 0;i < 10; i++)         //数组 
 8         scanf("%d",&a[i]);         //a[0]~a[9] 
 9     printf("\n");
10     for(j = 0; j < 9; j++)
11         for(i = 0;i < 9-j; i++)  //冒泡排序 
12         if(a[i] > a[i+1])        //核心算法 
13         {
14                 t = a[i];
15             a[i] = a[i+1];
16             a[i+1] = t;
17         }
18     printf("the sorted numbers :\n");
19     for(i = 0;i < 10; i++)      //输出 
20         printf("%d ",a[i]);     //数组 
21     printf("\n");                
22     return 0;
23 }

输出/输出结果:

上述起泡排序的最坏情况是数组 a 的初态为降序,在此最坏情况下的素颜发时间复杂度为 T(n) = O(n^2)。

一般情况下,除特别指明外,算法的时间复杂度均指最坏情况下的时间复杂度。

 

转载于:https://www.cnblogs.com/denglw/p/6765160.html

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值