| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 650 人关注过本帖
标题:关于排序的问题(每天一帖,学习进步。)大神指导。。。。
只看楼主 加入收藏
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:3 
程序代码:
#include<stdio.h>
void arrin(int *a ,int m)//返回值这里不能使int,下面的也是
{
    int i;
    for(i=0;i<m;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("the orignal arry is:\n");
    for(i=0;i<m;i++)
    {
        printf("%d ",a[i]);
    }
    putchar(10);
}
void arrselect(int *a,int m)
{
    int i,j,t;

    for(i=0;i<m-1;i++)
    {
        for(j=0;j<m-1-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
}
void arrout(int *a,int m)
{
    int i;
    printf("the new arry is :\n");
    for(i=0;i<m;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}
int main()
{
    int a[10];
    int m;
    puts("please input the number of arry!\n");
    scanf("%d",&m);
    arrin(a,m);
    arrselect(a,m);
    arrout(a,m);
    return 0;
}
另外就是你的代码风格不是很好,这样会使你的代码阅读性变差,这点一定要改正啊!

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-11-10 11:52
Mirob
Rank: 4
来 自:农村
等 级:业余侠客
帖 子:191
专家分:264
注 册:2012-7-20
收藏
得分:0 
回复 10楼 菜鸟一支
我再看看。
2012-11-10 12:06
Mirob
Rank: 4
来 自:农村
等 级:业余侠客
帖 子:191
专家分:264
注 册:2012-7-20
收藏
得分:0 
回复 8楼 未名湖的云
你看看,别按顺序输,最后一个数比前面一个数小的时候,就不行了。我想知道取到最后一个数时,最后一个数是怎么比较的?
图片附件: 游客没有浏览图片的权限,请 登录注册
2012-11-10 13:05
Mirob
Rank: 4
来 自:农村
等 级:业余侠客
帖 子:191
专家分:264
注 册:2012-7-20
收藏
得分:0 
回复 11楼 一个孩子
大神,我想知道,当取到最后一个数的时候,最后一个数是怎么进行比较的???我比较笨啊,没想明白
2012-11-10 13:06
Mirob
Rank: 4
来 自:农村
等 级:业余侠客
帖 子:191
专家分:264
注 册:2012-7-20
收藏
得分:0 
回复 7楼 小小战士
大神,帮忙分析下,比较的时候i的范围,m & m-1可以么
2012-11-10 13:24
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
回复 14楼 Mirob
首先说一下我的程序这种冒泡排序法的算法思想:
第一趟:
一列无序数字,首先比较第1个和第2个数,将小数放在第1个数的位置,大数放在第2个数的位置。然后比较第1个数和第3个数,将小数放在第1个书的位置,大数放在第3个数的位置,如此继续,直至比较第1个数和最后一个数,将小数放在第1个数的位置,大数放在最后一个数的位置上。至此第一趟结束,将最小的数放到了第1个数的位置。
第二趟:
从第2个数和第3个数开始比较,将小数放在第2个数的位置,大数放在第3个数的位置。然后比较第2个数和第4个数,将小数放在第2个数的位置,大数放在第4个数的位置,一直比较到比较第2个数和最后一个数后将小数放在第2个书的位置,大数放在最后一个数的位置,第二趟结束,在第2个数的位置上得到一个新的最小数(其实在整个数列中是第二小的数)。
如此下去,重复以上过程,直至最终完成排序。
值得说的是最后一趟:最后一趟只比较一次,比较的是倒数第2个位置上的数和最后位置的数,将小数放在倒数第2个数的位置,大数放在最后数的位置,整个排序完成,最后一个数就是整个数列的最大数
for(i=0;i<m-1;i++)//冒泡排序法
    {
        for(j=i+1;j<m;j++)
        {
            if(a[i]>a[j])
            {
                t=a[j];
                a[j]=a[i];
                a[i]=t;
            }
        }
    }

具体用程序中变量解释:
外层循环的i值每增加1,内层循环就跑一趟,而且每趟开始比较的时候都是a[i]和a[i+1]进行比较,比较的时候每次都是将最小数放在a[i]的位置上,这样反复,直到最后一趟i=m-1-1,j=m-1,a[m-1-1]和a[m-1]进行比较,也就是数组中倒数第二个数和最后一个数进行比较,小数放前大数放后,整个排序完成,数列按从小到大的顺序排列。

可见i值是从0到m-2变化的,如果定义数组有是个元素,即m=10,但数组元素只能取a[0]到a[9]即a[0]到a[m-1],也就是外层循环变量i取值为从0到8,i不必取到最后一个数,取到最后第2个数就可以了,而内层循环j开始比较的时候就取j=i+1,每一趟的最后一次比较i都取值8(倒数第2个数的下标),j都取值9(最后数的下标)
故而外层循环条件为for(i=0;i<m-1;i++),内层循环条件为for(j=i+1;j<m;j++)

[ 本帖最后由 小小战士 于 2012-11-10 14:51 编辑 ]

小小战士,战士中的战斗机!
2012-11-10 14:50
Mirob
Rank: 4
来 自:农村
等 级:业余侠客
帖 子:191
专家分:264
注 册:2012-7-20
收藏
得分:0 
回复 16楼 小小战士
刚才自己又想明白了,看了你的解释就更明白了,谢谢哈,幸苦。。。
2012-11-10 14:58
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
呵呵,这种学习的精神值得鼓励,加油!

小小战士,战士中的战斗机!
2012-11-10 15:10
未名湖的云
Rank: 3Rank: 3
来 自:安徽
等 级:论坛游侠
帖 子:130
专家分:190
注 册:2012-10-11
收藏
得分:0 
回复 13楼 Mirob
不会呀  我这运行的是这
图片附件: 游客没有浏览图片的权限,请 登录注册
个结果~~~~
2012-11-10 15:45
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
小小的战士也是战士

小小战士,战士中的战斗机!
2012-11-22 12:03
快速回复:关于排序的问题(每天一帖,学习进步。)大神指导。。。。
数据加载中...
 
   



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

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