网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月15日漏签0天
c语言吧 关注:798,988贴子:4,358,616
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 13回复贴,共1页
<<返回c语言吧
>0< 加载中...

冒泡排序算法分析及程序示例

  • 只看楼主
  • 收藏

  • 回复
  • longziyong
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
实例说明

  用冒泡排序方法对数组进行排序。

实例解析

  交换排序的基本思想是两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

  应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。

冒泡排序

  将被排序的记录数组 R[1..n] 垂直排列,每个记录 R[i] 看做是重量为 R[i].key 的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组 R 。凡扫描到违反本原则的轻气泡,就使其向上“漂浮”。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

  (1) 初始, R[1..n] 为无序区。

  (2) 第一趟扫描,从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较 (R[n],R[n-1]) 、 (R[n-1],R[n-2]) 、 … 、 (R[2],R[1]); 对于每对气泡 (R[j+1],R[j]), 若 R[j+1].key<R[j].key, 则交换 R[j+1] 和 R[j] 的内容。

  第一趟扫描完毕时,“最轻”的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置 R[1] 上。

  (3) 第二趟扫描,扫描 R[2..n]。扫描完毕时,“次轻”的气泡飘浮到 R[2] 的位置上 …… 最后,经过 n-1 趟扫描可得到有序区 R[1..n]。

  注意:第 i 趟扫描时, R[1..i-1] 和 R[i..n] 分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡漂浮到顶部位置 R[i] 上,结果是 R[1..i] 变为新的有序区。

冒泡排序算法

  因为每一趟排序都使有序区增加了一个气泡,在经过 n-1 趟排序之后,有序区中就有 n-1 个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行 n-1 趟排序。

  若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量 exchange, 在每趟排序开始前,先将其置为 FALSE 。若排序过程中发生了交换,则将其置为 TRUE 。各趟排序结束时检查 exchange, 若未曾发生过交换则终止算法,不再进行下趟排序。

具体算法如下:

void BubbleSort(SeqList R){ 
  //R(1..n) 是待排序的文件,采用自下向上扫描,对 R 做冒泡排序
  int i,j;
  Boolean exchange; // 交换标志
  for(i=1;i<n;i++){ // 最多做 n-1 趟排序
    exchange=FALSE; // 本趟排序开始前,交换标志应为假
    for(j=n-1;j>=i;j--) // 对当前无序区 R[i..n] 自下向上扫描
      if(R[j+1].key<R[j].key){ // 交换记录
        R[0]=R[j+1]; //R[0] 不是哨兵,仅做暂存单元
        R[j+1]=R[j];
        R[j]=R[0];
        exchange=TRUE; // 发生了交换,故将交换标志置为真
      }
    if(!exchange) // 本趟排序未发生交换,提前终止算法
      return;
  } //endfor( 外循环 )
}//BubbleSort

程序代码—冒泡排序

#include <stdio.h>
#define MAX 255
int R[MAX];

void Bubble_Sort(int n){
   /*R(1..n) 是待排序的文件,采用自下向上扫描,对 R 做冒泡排序 */
   int i,j;
   int exchange; /* 交换标志 */
   for(i=1;i<n;i++){ /* 最多做 n-1 趟排序 */
      exchange=0; /* 本趟排序开始前,交换标志应为假 */
      for(j=n-1;j>=i;j--) /* 对当前无序区 R[i..n] 自下向上扫描 */
         if(R[j+1]<R[j]){ /* 交换记录 */
            R[0]=R[j+1]; /* R[0] 不是哨兵,仅做暂存单元 */
            R[j+1]=R[j];
            R[j]=R[0];
            exchange=1; /* 发生了交换,故将交换标志置为真 */



  • 哀伤之月
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不是那样写的


2025-08-15 01:19:24
广告
不感兴趣
开通SVIP免广告
  • 哀伤之月
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
判断算法复杂度
应该用∑ 对每层计算进行累加
然后判断算法的有效性
应该用循环不变式


  • joneui
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我试了一下,咋就结果对的呢?


  • chankiller
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
外层循环应该从大到小:for(i=1;i<n;i++) 改为 for(i=n-1;i>=0;i--)
里层循环改为从小到大,在直接比较交换相邻的元素就行了,不用与R[0]比较。
冒泡是从底向上,而不是直接与R[0]交换,我是这样认为的。你估计根据 数据结构,严蔚敏的那本书写的,使用R[0]。


  • 我变成鱼了
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:14楼
R[0]是用来充当swap变量的...


  • 1173215144
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
真的借哦看看


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 13回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示