排序之冒泡排序

原创 2016年05月31日 17:27:58

本文以《啊哈!算法》为教材,个人理解整理。

例:将5个数字进行从大到小排序后输出。
  输入:35 99 18 12 76
  输出:99 76 35 18 12

对于例,冒泡排序大致的思路就是一趟一趟地循环比较,每一次循环的目的都是将未排序的数字中最小的数字移动到末尾。如:
  第一趟:XX XX XX XX 12
  第二趟:XX XX XX 18 12
  第三趟:XX XX 35 18 12
  第四趟:99 76 35 18 12

在分析时,我们先不考虑第一、二、三趟前面“XX”的数字是什么情况,只需要知道在末尾我们想要得到的是如以上的结果。在第四趟按照前三趟的规律可以确定76,剩下第一个“XX”的位置显然除了99就没有其他了,所以不需要进行第五趟。

通过以上分析已经可以知道,如果我们要排序n个数字,只需要进行n-1趟循环即可。

然后考虑每一趟如何将最小的数字归位。冒泡排序的方法是逐个两两比较大小,如果前者小于后者就交换位置,如:
(初始为35 99 18 12 76)
 第一趟的移动过程:
  99 35 18 12 76(比较了第1位和第2位,交换了位置)
  99 35 18 12 76(比较了第2位和第3位,没有交换位置)
  99 35 18 12 76(比较了第3位和第4位,没有交换位置)
  99 35 18 76 12(比较了第4位和第5位,交换了位置)

以上是第一趟的移动过程,显然第二趟移动过程是基于第一趟的结果的,即
初始为99 35 18 76 12
 第二趟的移动过程:
  99 35 18 76 12(未交换)
  99 35 18 76 12(未交换)
  99 35 76 18 12(交换)

 第三趟的移动过程:
  99 35 76 18 12(未交换)
  99 76 35 18 12(交换)

 第四趟的移动过程:
  99 76 35 18 12(未交换)

以上是四趟所有的交换过程,分析可以发现由于第一趟已经将12归位,即确定了12是这5个数字中最小的,因此在第二趟中就没有必要再把第4位和第5位进行比较,同理,第三趟不需要比较第3位和第4位,第4位和第5位。因此可知第一趟比较4次,第二趟比较3次,第三趟比较2次,第四趟比较1次,可以发现:趟的次序 + 比较次数 = 数字个数

用C语言表示,首先要获取5个待排序的数字,然后进行排序,最后输出。其中排序是一个双重嵌套循环,第一层循环表示循环“几趟”,如5个数字要4趟,6个数字要5趟,n个数字要n-1趟。第二层循环表示每趟要循环“比较几次”,上面分析已知:比较次数 = 数字个数 - 趟的次序。

int main()
{
    int a[5], i, j, t;
    for(i = 0; i < 5; i++)
    {
        scanf("%d", &a[i]); //获取5个待排序的数字 
    }

    for(i = 0; i < 4; i++) //5个数字需要进行4趟比较 
    {
        for(j = 0; j < 4-i; j++) //第一趟比较4次,第二趟比较3... 
        {
            if(a[j] < a[j+1])
            {
                t = a[j]; a[j] = a[j+1]; a[j+1] = t;
            }
        }
    }
    for(i = 0; i < 5; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构之排序算法(二)-冒泡排序及改进

冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。 ...
  • tuke_tuke
  • tuke_tuke
  • 2015年12月21日 15:10
  • 2055

冒泡排序(C++语言描述)

冒泡排序(Bubble Sort):一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。其时间复杂度为:O(n^2) 以下是我写的代码及其程序结果,程序用...
  • jwentao01
  • jwentao01
  • 2015年06月12日 14:13
  • 1368

OJ刷题之《双向冒泡排序》

题目描述 注:本题只需要提交填写部分的代码,请按照C++语言方式提交。 双向冒泡从小到大排序算法描述: (1)从当前序列的第1个元素开始,对相邻元素从前往后两两比较,不满足条件(从小到大)则...
  • Liuchang54
  • Liuchang54
  • 2015年01月02日 10:33
  • 1098

对冒泡排序的深入理解

  • 2014年08月18日 18:17
  • 49KB
  • 下载

冒泡排序算法

  • 2014年09月16日 09:59
  • 533B
  • 下载

冒泡排序 C语言

  • 2013年05月02日 18:49
  • 28KB
  • 下载

冒泡排序法

  • 2013年05月29日 16:43
  • 493B
  • 下载

冒泡排序的算法

  • 2013年05月27日 09:39
  • 241KB
  • 下载

一个简单的产生随机数并冒泡排序的算法

  • 2017年12月20日 21:32
  • 11KB
  • 下载

java冒泡排序详解

  • 2017年06月09日 09:49
  • 13KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序之冒泡排序
举报原因:
原因补充:

(最多只允许输入30个字)