题目:输入不少于两个数(含负数、小数),将它们按由小到大的顺序排列起来
要求:需要排序的数字通过参数传递进来。
例如:输入:./a.out -5 5 -6 5.2 4.1 6.5 -2.4 输出: -6 -5 -2.4 4.1 5 5.2 6.5
以下代码使用的是冒泡排序:
#include <stdio.h>
#include <stdlib.h> //atof函数必要的头文件
int order (int n, char *argv[])
{
int i,j;
float num[n];
float temp;
for (i = 0; i < n; i++)
{
num[i] = atof (argv[i + 1]); //将字符串转换为实型
}
//冒泡排序
for (i = 0; i < n - 1 ; i++)
{
for (j = 0; j < n - 1 - i ; j++)
{
if (num[j] > num[j + 1]) //相邻的元素比较,不符合排序规则的交换位置
{
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
printf ("从小到大排序为:");
for (i = 0; i < n; i++)
{
printf ("%5g",num[i]); //%g表示自动选择合适的表示法输出,不会输出多余的0
}
printf ("\n");
return 0;
}
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf ("Usage is %s num1 num2 ...\n",argv[0]);
}
else
{
order (argc - 1,argv); //指针数组传参
}
return 0;
}
也可以使用选择排序,以下是源代码:
#include <stdio.h>
#include <stdlib.h>
int order (int n, char *argv[])
{
int i,j;
float num[n];
float temp;
int min = 0; //假设认为第一个元素最小
for (i = 0; i < n; i++)
{
num[i] = atof (argv[i + 1]);
}
//选择排序
for (i = 0; i < n - 1 ; i++)
{
for (j = i; j < n - 1 ; j++)
{
if (num[min] > num[j + 1]) //比较出待排序的元素中最小的
{
min = j + 1;
}
}
temp = num[i]; //将比较得出的最小元素与待排序元素的第一个交换位置
num[i] = num[min];
num[min] = temp;
min = i + 1;
}
printf ("从小到大排序为:");
for (i = 0; i < n; i++)
{
printf ("%5g",num[i]);
}
printf ("\n");
return 0;
}
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf ("Usage is %s num1 num2 ...\n",argv[0]);
}
else
{
order (argc - 1,argv);
}
return 0;
}
关于排序问题,常用的排序方法有冒泡排序、选择排序和快速排序等。
冒泡排序的原理是比较相邻的元素,以从小到大排序为例,先比较第一个和它相邻的,如果不符合排序规则就交换他们两个,对后面每一对都进行同样操作。这样就把最大的数放到最后。以后每一趟可以少比较一个。直到没有任何一对数字需要比较。
选择排序的工作原理是每一次从待排序的元素中选出最小(或最大)的一个元素,存放在待排序的元素的第一位,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法,比如从小到大排序时,有时会把大的数排到小的数的前面。
当然最快的效率最高的是快速排序。