| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 386 人关注过本帖
标题:关于十数字排序问题
只看楼主 加入收藏
q0224100404
Rank: 2
等 级:论坛游民
帖 子:25
专家分:10
注 册:2015-11-24
结帖率:37.5%
收藏
已结贴  问题点数:20 回复次数:7 
关于十数字排序问题
听说有冒泡法,选择法,不太懂,谁帮我看下我的这个是什么法的
#include<stdio.h>
void main()/*十个整数排序问题*/
{
    int i,j,max,min;
    int a[10],b[10];
    printf("请输入10个整数:");  /*输入十个整数*/
    for(i=0;i<10;i++)
    {scanf("%d",&a[i]);}
    printf("输入数组为:\n"); /*输出原始排序*/
    for(i=0;i<10;i++)
    {printf("%5d",a[i]);
    if(i==9)printf("\n");}
   
    min=a[0];
    for(i=0;i<10;i++)
    {if(a[i]<min)
    min=a[i],a[i]=a[0],a[0]=min;} /*找出最小值*/
     
    for(i=0;i<10;i++)
    {
        max=a[0];
        for(j=0;j<10;j++)
        {if(a[j]>max)
        max=a[j],a[j]=a[0],a[0]=max;}
        b[i]=max;               /*找出最大值,并将其赋值给B数列,然后将A数列里面这个最大值赋值成最小值,然后循环找最大值*/
        a[0]=min;
    }
    for(i=0;i<10;i++)
    {a[i]=b[9-i];}            /*将A数列重新赋值为B数列的倒序*/

    printf("数组从小到大排列为:\n");
    for(i=0;i<10;i++)
    {printf("%5d",a[i]);
    if(i==9)printf("\n");}
    printf("数组从大到小排列为:\n");
    for(i=0;i<10;i++)
    {printf("%5d",b[i]);
    if(i==9)printf("\n");}

}
2015-11-27 00:17
邹阳
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:124
专家分:402
注 册:2015-10-8
收藏
得分:10 
排序有很多方法,经常使用的通常有:冒泡法和选择法
1.【冒泡法】顾名思义,冒泡法的原理:小的数字很轻,浮上来;大的数字很重,沉下去。
至于如何写,是通过两个for循环嵌套的方式,这里用a大概表示为:
a1和a2比较,如果a1>a2,不动;如果a1<a2 则temp=a1;a1=a2;a2=temp(编程中交换a1、a2的数字)。
a1和a3比较,如果a1>a3,不动;如果a1<a3 则temp=a1;a1=a3;a3=temp.
……
a1和aN比较,如果……,不动;如果…… 则……
里边的for循环执行完后,然后执行外边一次for循环,接下来就是:
a2和a3比较,如果a2>a3,不动;如果a2<a3 则temp=a2;a2=a3;a3=temp.
……
以此类推,知道执行完forfor循环后,大小也就排列出来了。
2.【选择法】相对简单些,同样采用forfor循环的嵌套,不过内容稍有不同了。
大体是:a1和a2比较,a2和a3比较,a3和a4比较……aN-1和aN比较(省略掉了比较内容,同上:如果aN>aN+1,不动;如果aN<aN+1 则temp=aN;aN=aN+1;aN+1=temp)
内部执行完一遍通过外层for循环后将要执行的是:a2和a3,a3和a4,a4和a5……
以此类推,最后同样能够排列出大小。

最后,根据LZ提供的代码来看:
核心代码:
   min=a[0];
    for(i=0;i<10;i++)
    {if(a[i]<min)
    min=a[i],a[i]=a[0],a[0]=min;} /*找出最小值*/
     
    for(i=0;i<10;i++)
    {
        max=a[0];
        for(j=0;j<10;j++)
        {if(a[j]>max)
        max=a[j],a[j]=a[0],a[0]=max;}
        b[i]=max;               /*找出最大值,并将其赋值给B数列,然后将A数列里面这个最大值赋值成最小值,然后循环找最大值*/
        a[0]=min;
    }

  这种算法,我不清楚是否是LZ自己编写出来的,我感觉其形式其实是类似选择法吧。
  其实大概就是 在排序的过程中不断的寻找最大值和最小值。
  我感觉这样写,特别难懂,并且容易出错,为何不先排序,最后的Max值和Min值不是更好找到吗?

[此贴子已经被作者于2015-11-27 15:34编辑过]


I'm a new comer
2015-11-27 07:49
q0224100404
Rank: 2
等 级:论坛游民
帖 子:25
专家分:10
注 册:2015-11-24
收藏
得分:0 
回复 3楼 边小白
人家下面列出的是冒泡法和选择法,至于上面的排序法,肯定是打错了,这有什么好深究的,谁还没个笔误的时候
2015-11-27 09:04
q0224100404
Rank: 2
等 级:论坛游民
帖 子:25
专家分:10
注 册:2015-11-24
收藏
得分:0 
回复 2楼 邹阳
我一开始不会排序啊,只会找最大最小,后面才利用最大最小,搞了这么一个算法来排序,不过现在会了,谢谢
2015-11-27 09:06
邹阳
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:124
专家分:402
注 册:2015-10-8
收藏
得分:0 
回复 3楼 边小白
感谢提醒,改过来了,选择法

I'm a new comer
2015-11-27 15:35
快速回复:关于十数字排序问题
数据加载中...
 
   



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

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