标题:冒泡排序求教
只看楼主
菜鸟要努力
Rank: 1
等 级:新手上路
帖 子:27
专家分:1
注 册:2013-3-4
结帖率:100%
已结贴  问题点数:20 回复次数:10 
冒泡排序求教
#include<stdio.h>
void main()
{
    int i=0,j=0,p=0;
    int a[7]={1,2,8,3,2,4,9};
    for(j=1;j<=5;j++)
        for(i=1;i<=6-j;i++)
            if(a[i]<a[i+1])
            {
                p=a[i];
                a[i]=a[i+1];
                a[i+1]=p;
            }
            for(i=6;i>0;i--)
                printf("a[%d]=%d\n",i,a[i]);
}
请问下里面的i表示第j遍扫描待比较元素的下标,i=1,2,...n-j;
排序后变化(不设置a[0])
a[6] 9                     1
a[5] 4                     9
a[4] 2  第一次扫描后排序为 4
a[3] 3                     2
a[2] 8                     3
a[1] 1                     8
然后比如说如题n=6,假设是第1遍扫描,那么就是i=6-1=5,就是a[5] 然后就是9了...不应该是1吗?这个怎么理解呢?
谢谢~~

搜索更多相关主题的帖子: 扫描 include 元素 
2013-03-04 19:06
小xiong
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:388
专家分:1722
注 册:2013-2-8
得分:3 
...
2013-03-04 19:29
梦幻乐园
Rank: 2
等 级:论坛游民
帖 子:62
专家分:87
注 册:2012-10-25
得分:3 
你这里的数组应该从零开始,冒泡排序就是通过两次循环进行排序,比较方便的
2013-03-04 19:30
逆风而前
Rank: 7Rank: 7Rank: 7
来 自:福建
等 级:黑侠
威 望:7
帖 子:193
专家分:567
注 册:2013-2-14
得分:3 
数组下标从0开始
2013-03-04 19:46
逆风而前
Rank: 7Rank: 7Rank: 7
来 自:福建
等 级:黑侠
威 望:7
帖 子:193
专家分:567
注 册:2013-2-14
得分:0 
#include<stdio.h>
void main()
{
    int i=0,j=0,p=0;
    int a[7]={5,12,8,6,7,4,9};
    for(j=0;j<6;j++)
        for(i=0;i<6-j;i++)
            if(a[i]<a[i+1])
            {
                p=a[i];
                a[i]=a[i+1];
                a[i+1]=p;
            }
   for(i=6;i>=0;i--)
      printf("a[%d]=%d\n",i,a[i]);
}
2013-03-04 20:03
shmilyflf
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:356
专家分:1008
注 册:2012-12-9
得分:3 
冒泡排序:
#include<stdio.h>
 void main()
 {
     int i=0,j=0,p=0;
     int a[7]={5,12,8,6,7,4,9};
     for(j=0;j<6;j++)
         for(i=0;i<6-j;i++)
             if(a[i]>a[i+1])
             {
                 p=a[i];
                 a[i]=a[i+1];
                 a[i+1]=p;
             }
    for(i=6;i>=0;i--)
       printf("a[%d]=%d\n",i,a[i]);
 }
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。(以上文字引自百度百科)

故5楼的不能算是正常的冒泡排序,排反了。
2013-03-04 21:08
smile_line
Rank: 2
等 级:论坛游民
帖 子:65
专家分:19
注 册:2013-3-3
得分:3 
啊?你想问什么??
2013-03-04 21:48
菜鸟要努力
Rank: 1
等 级:新手上路
帖 子:27
专家分:1
注 册:2013-3-4
得分:0 
回复 7楼 smile_line
额...简单说就是不明白i跟j的关系
2013-03-04 23:47
菜鸟要努力
Rank: 1
等 级:新手上路
帖 子:27
专家分:1
注 册:2013-3-4
得分:0 
回复 4楼 逆风而前
课本例题是从a[1]开始的,最底层是a[1]的 然后就是不太明白i跟j的关系 为什么是i<=6-j
2013-03-04 23:49
nandiin
Rank: 2
等 级:论坛游民
帖 子:29
专家分:25
注 册:2013-2-28
得分:3 
int a[7]={1,2,8,3,2,4,9};
这句话的结果是
a[0]=1
a[1]=2
a[2]=8
a[3]=3
a[4]=2
a[5]=4
a[6]=9
第一次外循环 j=1
    第一次内循环 i=1
        a[1]<a[2]  为true  换位结果  1,8,2,3,2,4,9
    第二次内循环 i=2
        a[2]<a[3] 为true  换位结果 1,8,3,2,2,4,9
    第三次内循环  i=3
        a[3]<a[4] 为false  不换位
    第四次内循环  i=4
        a[4]<a[5] 为true 换位结果 1,8,3,2,4,2,9
    第五次内循环 i=5
        a[5]<a[6] 为ture 换位结果 1,8,3,2,4,9,2
    i++ i=6 不满足内循环条件 跳出内循环
第二次外循环
    ·····
    以此类推


楼主要注意,数字是从0开始记下标的,你可以不用但是,你写的a[1]肯定是指的第二个元素

如果想查看每次更换结果,可以在内层循环中加上一句(记得内循环加了语句要用大括号包起来)
printf("本次内循环结果为:%d,%d,%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6]]);


[ 本帖最后由 nandiin 于 2013-3-5 14:12 编辑 ]
2013-03-05 00:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-399719-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022645 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved