简单LinuxC程序关于排序问题(冒泡排序与选择排序)

来源:互联网 发布:网络大众理财产品收益 编辑:程序博客网 时间:2024/06/16 13:40

题目:输入不少于两个数(含负数、小数),将它们按由小到大的顺序排列起来

要求:需要排序的数字通过参数传递进来。

例如:输入:./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;}

            关于排序问题,常用的排序方法有冒泡排序、选择排序和快速排序等。
       冒泡排序的原理是比较相邻的元素,以从小到大排序为例,先比较第一个和它相邻的,如果不符合排序规则就交换他们两个,对后面每一对都进行同样操作。这样就把最大的数放到最后。以后每一趟可以少比较一个直到没有任何一对数字需要比较。
        选择排序的工作原理是每一次从待排序的元素中选出最小(或最大)的一个元素,存放在待排序的元素的第一位,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法,比如从小到大排序时,有时会把大的数排到小的数的前面。
        当然最快的效率最高的是快速排序。