C语言--怎样实现输入任意几个数排序

#include<stdio.h>
main()
{
float a[10];
int i,j;
printf("请输入要比较的数:");
for(i=0;i<=9;i++)
{
scanf("%f",&a[i]);
}
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{a[j]=a[j]+a[j+1];a[j+1]=a[j]-a[j+1];a[j]=a[j]-a[j+1];}
printf("这10个数从小到大排列的顺序是:");
for(i=0;i<=9;i++)
printf("%-7.2f",a[i]);
}
这个是输入10个数用冒泡排序法排列的程序,我想问的是如何实现任意多个数排序,比如说我输入10个,100,250个都能将其排序!
非常感谢!
一楼的意思我懂,我想实现的是不用每次都修改源程序,就可以实现任意多个数排序!就像EXCEL里面的排序函数一样,你无论输入多少个数,他都可以自动排序,而不用修改它的源代码!
我现在感觉我是在寻找C语言中如何能够实现数组的“动态定义”(C不允许直接对数组直接动态定义,比如说int a[n];)。

把循环次数改成你想要的数就可以了。

比如上面你的程序,for语句中的i<=9,这个9改成你想要的次数。另一种方法,这个次数也作为一个变量从键盘输入,这样适应性相对来说好一些,不用每次都编译程序。

提醒,如果是大批量的输入数据,用键盘逐个输入数据是比较低效和低准确率的方法,通常采用数据文件(比如一个文本文件)的方式。

你能问出这个问题来,说明你对上面的代码还没有理解透彻,好好学习吧。
----------------------------------------------------
对于lz的补充的回答:
我前面说的:另一种方法,这个次数也作为一个变量从键盘输入,这样适应性相对来说好一些,不用每次都编译程序。

但是有一个问题,就是C不支持动态定义数组。解决方法两种:一、定义一个足够大的数组(但有越界的可能,程序里要做判断和控制)。二、使用动态内存分配,可以从根本上解决此问题。

还有一种折中的办法,就是对排序数定义一个宏,程序中的循环都使用这个宏来控制循环,如果排序数量更改了,虽然需要重新编译程序,但是也很好修改,只要改这个宏的数值就可以了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-11

关于排序的方法有很多种,例如:冒泡排序、选择排序、插入排序、归并排序等等。

下面以冒牌排序来实现任意几个数的排序:

#include <stdio.h>

//冒泡排序,由低到高
int main()
{
    
    int a[10] = {2,5,9,15,1,6,4,8,26,33};
    int temp;
    int i, j;

    for (i = 1; i < 10; i++)
    {
        for (j = 0; j < i; j++)
        {
            if (a[j] > a[j+1])
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }

    for (i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

运行结果为:1 2 4 5 6 8 9 15 26 33

冒泡排序法是相邻之间的数据进行比较,每经过一次j循环,就将符合条件的待排数据进行一次移动互换,直到第n-1次移动互换,将整个数据排列完成。以下为j循环后的结果:

初始:2,5,9,15,1,6,4,8,26,33

第1次: 2,5,9,1,6,4,8,15,26,33

第2次: 2,5,1,6,4,8,9,15,26,33

第3次: 2,1,5,4,6,8,9,15,26,33

第4次: 1,2,4,5,6,8,9,15,26,33

第5次: 1,2,4,5,6,8,9,15,26,33

第6次: 1,2,4,5,6,8,9,15,26,33

第7次: 1,2,4,5,6,8,9,15,26,33

第8次: 1,2,4,5,6,8,9,15,26,33

第9次: 1,2,4,5,6,8,9,15,26,33

注意最小的数据的移动。

第2个回答  2009-12-17
如果你会用指针的话,你可以创建一个动态链表,每次输入时做排序,这样就建成了一个有序的链表,你输出时就会是顺序的了。如果你想从小到大和从大到小都能输出,就建两个指针域,一个存前一地址,一个存下一地址。
第3个回答  推荐于2017-09-13
楼主的思路是对的。不能直接对数组用动态定义,但是可以对指针使用。所以动态定义一个指针,把它当成数组用。我把你的程序做了些简单的修改,运行成功。
源程序如下:
#include<stdio.h>
#include<stdlib.h>
main()
{
float *a;
int i,j,length;
printf("请输入要排序数字的个数:\n");
scanf("%d",&length);
a=(float *)malloc(length*sizeof(float));
printf("请输入%d个数(数字之间用空格或回车隔开):\n",length);
for(i=0;i<length;i++)
{
scanf("%f",&a[i]);
}
for(i=0;i<length-1;i++)
for(j=0;j<length-1-i;j++)
if(a[j]>a[j+1])
{a[j]=a[j]+a[j+1];a[j+1]=a[j]-a[j+1];a[j]=a[j]-a[j+1];}
printf("这%d个数从小到大排列的顺序是:\n",length);
for(i=0;i<length;i++)
printf("%-7.2f\n",a[i]);
}本回答被提问者采纳
第4个回答  2009-12-17
这就涉及到函数的调用,你把第一个函数的作用为实现多个数据的输入,第二个函数实现冒泡排序,这样就可以了.
主要是参数不同而已,

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网