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

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

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

例如:输入:./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 
#include       //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 
#include 

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;
}

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

你可能感兴趣的:(简单LinuxC)