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

xiaoxiao2021-02-28  71

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

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

例如:输入:./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; }              关于排序问题,常用的排序方法有冒泡排序、选择排序和快速排序等。        冒泡排序的原理是比较相邻的元素,以从小到大排序为例,先比较第一个和它相邻的,如果不符合排序规则就交换他们两个,对后面每一对都进行同样操作。这样就把最大的数放到最后。以后每一趟可以少比较一个直到没有任何一对数字需要比较。         选择排序的工作原理是每一次从待排序的元素中选出最小(或最大)的一个元素,存放在待排序的元素的第一位,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法,比如从小到大排序时,有时会把大的数排到小的数的前面。         当然最快的效率最高的是快速排序。
转载请注明原文地址: https://www.6miu.com/read-53794.html

最新回复(0)