#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不支持动态定义数组。解决方法两种:一、定义一个足够大的数组(但有越界的可能,程序里要做判断和控制)。二、使用动态内存分配,可以从根本上解决此问题。
还有一种折中的办法,就是对排序数定义一个宏,程序中的循环都使用这个宏来控制循环,如果排序数量更改了,虽然需要重新编译程序,但是也很好修改,只要改这个宏的数值就可以了。
关于排序的方法有很多种,例如:冒泡排序、选择排序、插入排序、归并排序等等。
下面以冒牌排序来实现任意几个数的排序:
#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
注意最小的数据的移动。
源程序如下:
#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]);
}本回答被提问者采纳
主要是参数不同而已,