冒泡排序法,思路详解

冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。


比如对下面这个序列进行从小到大排序:
90 21 132 -58 34


第一轮:

  1. 90 和 21比,90>21,则它们互换位置:
    21 90 132 -58 34
  2. 90 和 132 比,90<132,则不用交换位置。
    3)132 和 –58 比,132>–58,则它们互换位置:
    21 90 -58 132 34
    4)132 和 34 比,132>34,则它们互换位置:
    21 90 -58 34 132
    到此第一轮就比较完了。第一轮的结果是找到了序列中最大的那个数,并浮到了最右边。

比较时,每轮中第 n 次比较是新序列中第 n 个元素和第 n+1 个元素的比较(假如 n 从 1 开始)。


第二轮:

  1. 21 和 90 比,21<90,则不用交换位置。
  2. 90 和 –58 比,90>–58,则它们互换位置:
    21 -58 90 34 132
  3. 90 和 34 比,90>34,则它们互换位置:
    21 -58 34 90 132
    到此第二轮就比较完了。第二轮的结果是找到了序列中第二大的那个数,并浮到了最右边第二个位置。

第三轮:

  1. 21 和 –58 比,21>–58,则它们互换位置:
    -58 21 34 90 132
  2. 21 和 34 比,21<34,则不用交换位置。

到此第三轮就比较完了。第三轮的结果是找到了序列中第三大的那个数,并浮到了最右边第三个位置。


第四轮:

  1. –58 和 21 比,–58<21,则不用交换位置。
    至此,整个序列排序完毕。从小到大的序列就是“–58 21 34 90 132”。

从这个例子中还可以总结出,如果有 n 个数据,那么只需要比较 n–1 轮,因为每进行一轮排序,就能找到一个最大的数字,所以每轮比较进行n-1-i次(i为右边已经确定位置的数字个数,也就是已经进行的轮数)。

下面写一个程序:

# include <stdio.h>

int main(){
    int num[10] = {3,0,1,8,7,2,5,4,9,6} ;
    int temp;
    int n;
    n = sizeof(num)/sizeof(int);//计算数组的元素个数
       //循环比较n- 1次 
    for(int i = 0;i < n - 1;i++){   
      //每次循环,要比较n-1-i次
        for(int j = 0;j < n - 1 - i;j++){
            if(num[j] > num[j+1]){
                temp = num[j + 1];
                num[j + 1 ] = num[j];
                num[j] = temp;              
            }                   
        }   
    }
    
    for(int i = 0;i < 10;i++){
        printf("%d ",num[i]);
    }
    
    return 0;
}

输出结果为:0 1 2 3 4 5 6 7 8 9

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 13,028评论 0 10
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,706评论 0 2
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 5,341评论 1 4
  • 初中的时候,情窦初开,少男少女情怀。 我也不例外,那时候对一个男孩子有了好感,在这里,我就称呼他为阳。 不知道是不...
    d71cfaf59fd7阅读 3,895评论 0 0
  • 嫩柳池边初拂水 新桃树下正临风[莫之] 一湾碧水群山抱 千树红花百鸟飞[莫之] 断送落花三月雨 留连残梦五更风[莫...
    江南莫之阅读 3,741评论 17 18