| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3260 人关注过本帖
标题:排序方法-冒泡法
只看楼主 加入收藏
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
结帖率:100%
收藏
 问题点数:0 回复次数:11 
排序方法-冒泡法
冒泡法1                                                                     
程序代码:
#include <stdio.h>
void main()
{
    int a,b,c,d[10]={2,5,29,80,70,63,82,39,11,1};
    int t=0,e=0;
    for(a=0;a<10;a++)
     for(b=0;b<9-a;b++,t++)
     if(d[b]>d[b+1])
        {
            printf("第%d次:%d>%d\n",++e,d[b],d[b+1]);
            c=d[b];
            d[b]=d[b+1];
            d[b+1]=c;
        }
    for(a=0;a<10;a++)
    printf("%4d\n",d[a]);
    printf("总循环%d次",t);
}


[此贴子已经被作者于2019-9-7 10:56编辑过]

搜索更多相关主题的帖子: 冒泡法 for 排序 printf 方法 
2019-09-04 16:13
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
用dev软件,这样可以正常运行:
程序代码:
#include <stdio.h>
main()
{
    int a,b,c,d[10]={2,5,29,80,70,63,82,39,11,1};
    int t=0,e=0;
    for(a=0;a<10;a++)
     for(b=0;b<9-a;b++,t++)
     if(d[b]>d[b+1])
        {
            printf("第%d次:%d>%d\n",++e,d[b],d[b+1]);
            c=d[b];
            d[b]=d[b+1];
            d[b+1]=c;
        }
    for(a=0;a<10;a++)
    printf("%4d\n",d[a]);
    printf("总循环%d次",t);
}
2019-09-04 21:01
沐涼
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2018-12-31
收藏
得分:0 
不能用空函数,c语言最好还是设置的有主函数,这样好认出来什么是主要的,什么是其他辅助的函数。
2019-09-04 23:19
沐涼
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2018-12-31
收藏
得分:0 
提示的错误是:“main” must return “int”。意思的必须要有回归int的类型,你在这里面没有int的主要函数。
2019-09-04 23:24
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
收藏
得分:0 
回复 4楼 沐涼
之前在学校里学C语音用的编译器直接写main(),运行完也没有错误提示,但在自己下载的编译器上运行总是提示错误需要添加函数类型。学校里学的不是特别全面,有些巧合,如果没有结合其他资料,经常会有各种“错误”。
2019-09-05 08:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 5楼 bcbbcclbbc
首先,C/C++标准中 Startup function 只有两种形式:
int main( void )
int main( int argc, char* argv[] )

然后一一来讲那些歪门邪道的形式
1. 不标示返回类型的,比如 main( void ) 等
    这是因为古老的 K&R 中一切类型默认为 int,因此 main( void ) 其实等价于 int main( void ),
    但是要记住,现在的C标准早就禁止此种行为了,不再有默认int类型的行为。

2. 参数列表瞎鸡巴填写的,比如 int main()、int main( double, float ) 等等
    这是因为C语言没有“函数重载”的功能,因此LINK时内部符号不带有参数。即对链接器而言,它只知道函数名叫做main,无从得知其参数形式,即便参数形式是错误的,它也不知道,只能当作正确的处理。假如因为参数形式错误而导致运行时错误,那就不是它的过错了。
    注:在C++中 int main() 形式是正确的,因为C++中函数参数列表为空,代表不接受任何参数,即 fun(void);而在C中,若函数参数列表为空,代表可接受任意多任意类型的参数,即 fun(...)。

3. void main 等
    只存在于一些不正经的C编译器中,比如 trubo c 等垃圾编译器。
    有些人会说C/C++标准也允许编译器实现自定义的格式,确实,但返回类型不在此列。因为main返回值是给调用者的,如果允许void,那么调用者就需要另外的手段知道被调用者是返回int还是其它。C/C++ 对编译器扩展的 Startup function 规定,返回类型必须是 int,若有第一参数,第一参数必须是 int 及其兼容类型,若有第二参数,第二参数必须是 char* argv[] 及其兼容类型。例如,VC++ 的 int main( int argc, char* argv[], char* envp[] ) 就属于符合C/C++标准的main扩展。
2019-09-05 08:55
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
收藏
得分:0 
回复 6楼 rjsp
就是说主函数main()不能写成void main(),要写成int main()么,这个没有特别的清楚认识。
因为在自定义函数中给出了void类型,可以不用写返回语句return ,所以只要不需要返回值的函数都直接定义为void了。
2019-09-05 13:29
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
收藏
得分:0 
冒泡法2
程序代码:
#include <stdio.h>
#define S 10
#define C compare
int main()
{
    int C(int *,int *);
    int a,b,c,e,t;
    int d[S]={4,1,2,11,29,39,53,70,88,82};
    for(a=0,t=0;a<S/2;a++)
    {
     for(b=a,e=0;b<S-1-a;b++)
     {
         e+=C(&d[b],&d[b+1]);   //大数上升
         e+=C(&d[a],&d[b]);    //小数下沉
         t++;
     }
     if(e==0)        //数组元素未发生交换,结束循环
      break;
    }
    printf("从小到大依次排序为:\n");
    for(a=0;a<10;a++)
     printf("%4d",d[a]);
    printf("\n总循环%d次",t);
    return 0;
}
int C(int *a,int *b)
{
    int c=0;
    if(*a>*b)
    {
        c=*a;
        *a=*b;
        *b=c;
        c=1;
    }
    return c;
}
2019-09-06 17:54
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
收藏
得分:0 
冒泡法2-2 (加入了些新学到的东西)
程序代码:
#include <stdio.h>
#define S 10                        //数组内元素个数
#define Point_A                     //隐藏或显示.(条件编译)
int main()
{
    int C(int *,int *);
    int d[S]={0,1,2,11,29,39,53,70,80,90};
    int a,b,c,t,e;
    int *p=d;
    e=1;   //判断e的值:e=1时,数组元素有交换;e=0时,数组排序完成。
    t=0;   //循环计算。
    for(a=0;e>=1;a++)
     for(b=a,e=0;b<S-1-a;b++)
     {
         t++;
         #ifdef Point_A              //条件编译.
         e=C(p+b,p+b+1)+C(p+a,p+b);  //方法0:通过指针指向数组,据说比方法1效率更高
         c=0;
         #else                       //方法1:直接使用数组元素
         e+=C(&d[b],&d[b+1]);//大数上升
         e+=C(&d[a],&d[b]);//小数下沉
         c=1;
         #endif
     }
    printf("方法%d:\n",c);
    printf("从小到大依次排序为:\n");
    for(a=0;a<10;a++)
     printf("%4d",d[a]);
    printf("\n总共循环%d次。",t);
    return 0;
}
int C(int *a,int *b)
{
    int c=0;
    if(*a>*b)
    {
        c=*a;
        *a=*b;
        *b=c;
        c=1;
    }
    return c;
}


[此贴子已经被作者于2019-9-8 09:50编辑过]

2019-09-07 17:53
沈和
Rank: 4
等 级:业余侠客
威 望:5
帖 子:45
专家分:214
注 册:2019-8-26
收藏
得分:0 
e+=C(&d[b],&d[b+1]);// 这里的注释是不是应该写 大数下沉
e+=C(&d[a],&d[b]);    // 这里的注释是不是应该写 小数上升
2019-09-07 18:31
快速回复:排序方法-冒泡法
数据加载中...
 
   



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

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