排序之冒泡排序

原创 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

排序之冒泡排序

/*冒泡排序的思想:需要进行n-1趟比较,每一趟比较将最大的元素排在最后一位  *第一趟比较,依次比较0和1、1和2、2和3 、.....、n-2和n-1处的索引元素,如果第一个数据大于后一个数据,则...

排序之冒泡排序

冒泡排序是一种交换排序。 什么是交换排序呢? 交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。算法思想它重复地走访过要排序的数列,一次比较两个元素,如...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

排序之冒泡排序

本文以《啊哈!算法》为教材,个人理解整理。 例:将5个数字进行从大到小排序后输出。 输入:35 99 18 12 76 输出:99 76 35 18 ...

排序之冒泡排序

冒泡排序思想在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将...

排序之冒泡排序

冒泡排序思想对于一个数字序列来说,我们可以依次比较相邻的两项数字,假如相邻的两项分别记为A和B。如果A的值大于B,那么进行A、B之间顺序的交换,将较大值移到后面。之后再用第二个值与第三个值进行比较,将...

排序 - 冒泡排序

首先想,给你一个无序的数组,让你求其中的一个最大值?我们可以轻松的想到,从头开始对数组两两进行比较,不断的把相对较大往后移动,比如: 3 2 1 4 7 6 5 2 3 1 4 7 6 ...

排序(1)冒泡排序

排序(1)冒泡排序 摘要: 在C语言的学习过程中, 排序可以对循环及选择进行一个很好的训练,在实际编程中也有着很重要的作用,本文针对于众多排序算法中的冒泡排序(之后还有快速排序、插入排序及选...

Java 排序 - 冒泡排序

排序算法是最简单的入门级算法,冒泡排序虽然不稳定,但是简单,容易上手,所以,今天复习了下,作为自己的学习记录。高手请略过! package com.wicresoft.demo; public c...

冒泡排序

冒泡排序是很经典的排序算法,记得大一的时候我去参加我们学校的linux兴趣小组,那个时候简直太菜了,人家让我写,我写了半天写不出来,真是o(╯□╰)o 我觉得要掌握冒泡排序及其算法,需要记住两点: ...
  • zpxly
  • zpxly
  • 2013-06-01 12:30
  • 507

冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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