从杂乱到有序并不简单--排序算法之一冒泡法

从杂乱到有序并不简单--排序算法

        排序,生活中的平常事,在众多无序个体中,选择一种标准,如从大到小,从高到矮,从多到少进行排列,使之成为一个有序有规律的序列,这就是排序!

排序对少数个体而言,是一件容易的事,如两个个体,比较一次就可以决定,三个个体则在比较三次才能确定,当个体数目大时,排序并不容易。好多排序方法复杂度上是效率 O(n²)。

         真实地讲,从杂乱到有序并不简单。本文来谈谈排序算法。

        正因为排序算法不简单,所有前人为我们找到了好多算法,这些排序算法,各有千秋,难易不同,当然效率也不同。

        据我所了解,大约有十来种排序算法。它们是

  • 冒泡(Bubble)排序——相邻交换 
  • 选择排序——每次最小/大排在相应的位置 
  • 插入排序——将下一个插入已排好的序列中 
  • 希而/尔(Shell)排序——缩小增量 
  • 归并排序 
  • 快速排序 
  • 堆排序 
  • 拓扑排序 
  •  锦标赛排序 
  • 基数排序 

        一般地,考虑一个算法的好坏,主要从下三个方面来考虑:

(1)执行时间 

     时间复杂度,主要考虑执行主要功能运算要运算的次数。

(2)存储空间 

     运算时需要占用的存储空间。

(3)编程工作量 

        在排序数据不多时,(1)(2)因素差别不大,这时主要考虑因素3了。对于大量的数据,时间复杂度是算法首要考虑的因素,因为排序算法时的效率是数据量的平方O(n²)。 

        下面将分别介绍各种排序算法。

   一、冒泡(Bubble)排序 

冒泡排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,重复地进行直到没有再需要交换。这个算法的名字是一种形象的说法,越小的元素会经由交换慢慢“浮”到数列的顶端,犹如水中的气泡慢慢浮起来而冒出水面。

  冒泡排序算法的如下:

    比较相邻的元素。如果第一个比第二个大或小,就交换他们两个。

    对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

    针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

以下面数据为例,说明排序过程:

初始关键字  [9 8 5 4 2 0]


第一轮:    [9 8 5 4 2 0]

第1次排序后[8 9 5 4 2 0]

第2次排序后[8 5 9 4 2 0]

第3次排序后[8 5 4 9 2 0]

第4次排序后[8 5 4 2 9 0]

第5次排序后[8 5 4 2 0 9]

 

第二轮:    [8 5 4 2 0 9]

第1次排序后[5 8 4 2 0 9]

第2次排序后[5 4 8 2 0 9]

第3次排序后[5 4 2 8 0 9]

第4次排序后[5 4 2 0 8 9]

 

第三轮:    [5 4 2 0 8 9]

第1次排序后[4 5 2 0 8 9]

第2次排序后[4 2 5 0 8 9]

第3次排序后[4 2 0 5 8 9]

 

第四轮:    [4 2 0 5 8 9]

第1次排序后[2 4 0 5 8 9]

第2次排序后[2 0 4 5 8 9]

 

第五轮:    [2 0 4 5 8 9]

第1次排序后[0 2 4 5 8 9]

 

总共运算次数:5+4+3+2+1=15

算法伪码:

for(int i=1;i<n;i++) 

       for(intj=0;i<n-i;j++) 

            if(a[j]>a[j+1])             //比较相邻元素 

               {  int temp; 

                   temp=a[j];            //交换相邻元素

                   a[j]=a[j+1];

                   a[j+1]=temp;      

             } 

      

        上例数据有些特殊,原来数序列是从大到小的,是好让大家看到数据移动过程,大家看到9了吗,一直从左向右移动,如果将数列倒置,就犹如气泡上浮,这正是气泡法的由来。所以,冒泡排序算法是一种较容易理解的算法,也是初学者一般都要求掌握的算法,其它几种算法将会一一介绍。

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 冒泡排序是一种简单排序算法,它的基本思想是通过不断比较相邻的两个数,将较大的数向后移动,直到所有的数都按照从小到大的顺序排列好。 对于给定的n个无序整数,可以使用冒泡排序进行排序。具体步骤如下: 1. 从第一个数开始,依次比较相邻的两个数,如果前一个数比后一个数大,则交换它们的位置。 2. 继续比较下一对相邻的数,直到最后一对数。 3. 重复以上步骤,直到所有的数都按照从小到大的顺序排列好。 对于n=5的情况,可以按照以下步骤进行排序: 1. 假设给定的5个数为a1, a2, a3, a4, a5。 2. 第一轮比较,比较a1和a2,如果a1>a2,则交换它们的位置;比较a2和a3,如果a2>a3,则交换它们的位置;比较a3和a4,如果a3>a4,则交换它们的位置;比较a4和a5,如果a4>a5,则交换它们的位置。此时,最大的数a5已经排在了最后。 3. 第二轮比较,比较a1和a2,如果a1>a2,则交换它们的位置;比较a2和a3,如果a2>a3,则交换它们的位置;比较a3和a4,如果a3>a4,则交换它们的位置。此时,第二大的数a4已经排在了倒数第二个位置。 4. 第三轮比较,比较a1和a2,如果a1>a2,则交换它们的位置;比较a2和a3,如果a2>a3,则交换它们的位置。此时,第三大的数a3已经排在了倒数第三个位置。 5. 第四轮比较,比较a1和a2,如果a1>a2,则交换它们的位置。此时,第四大的数a2已经排在了倒数第四个位置。 6. 最后一轮比较,所有的数已经按照从小到大的顺序排列好了。 因此,按照冒泡排序,给定的5个无序整数可以按照从小到大的顺序排列为:a1, a2, a3, a4, a5。 ### 回答2: 冒泡排序是一种简单的排序方,其基本思想是对待排序的n个元素,从第一个元素开始依次比较相邻的两个元素,根据大小交换它们的位置,这样一轮比较下来,最后一个元素会是n个元素中的最大值或最小值,接着再对前n-1个元素进行同样的操作,直到整个序列排序完成。 对于本题,我们可以采用以下的步骤进行排序: 首先将n个无序整数存入一个数组中,假设数组名为a。为了将a中的元素从小到大排序,我们可以使用以下的核心代码实现排序部分: //冒泡排序核心代码 for(int i = 0; i < n-1; i++){ for(int j = 0; j < n-1-i; j++){ if(a[j] > a[j+1]){ int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } 该段代码中,外层的for循环控制了一共进行n-1轮比较,内层的for循环则是每一轮比较时相邻元素的比较和交换。在内层for循环中,通过比较a[j]和a[j+1]的大小,来决定是否需要交换这两个元素的位置,从而实现每轮比较的排序操作。 最后,我们采用一个简单的循环将排序后的结果依次输出即可: //将排序后的a数组元素输出 for(int i = 0; i < n; i++){ cout << a[i] << " "; } 通过以上的步骤,便可以实现将这n个无序整数从小到大排序后输出的操作。 ### 回答3: 冒泡排序是一种简单排序算法,它的基本思想是通过逐次比较和交换相邻两个元素的大小关系,将整个序列按照从小到大或从大到小排列。 具体来说,对于一个无序整数序列,冒泡排序的过程如下: 1. 用循环遍历整个序列,对于相邻的两个元素进行比较,如果前一个元素大于后一个元素,则交换这两个元素的位置。 2. 继续遍历序列,对于剩下的元素进行同样的比较和交换操作,直到整个序列没有相邻元素需要交换为止。 3. 重复以上操作,直到整个序列都按照从小到大排列。 对于本题,给定一个n为5的无序整数序列,可以按照如下步骤进行冒泡排序: 1. 首先遍历整个序列,比较第一个元素和第二个元素的大小。如果第一个元素大于第二个元素,则交换这两个元素的位置,否则不变。 2. 继续比较第二个元素和第三个元素、第三个元素和第四个元素、第四个元素和第五个元素的大小,进行相应的交换操作。 3. 重复执行以上操作,直到整个序列都按照从小到大排列。 最终排序后的结果为从小到大排列的整数序列,可以按照顺序输出即可。 需要注意的是,冒泡排序是一种效率较低的算,时间复杂度为O(n^2),对于数据量较大的场景并不适用,因此在实际应用中需要选择更加高效的排序算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值