1.首先无论何种排序方法其最终目的是按要求将所给数据进行排序。而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法——冒泡排序法和选择排序法。
下面将举一个例子进行讲解:
要求:从键盘输出10个整数,要求对它们按照从小到大的顺序排列。
冒泡排序法:
#include<stdio.h>
int main()
{
int a[10];
int i,j,t;
printf("输入10个整数:");
for(i=0;i<10;i++) //先对一维数组赋值
scanf("%d",&a[i]);
for(j=0;j<9;j++) //这一步是进行9次“循环”,实现9趟“比较”
for(i=0;i<9-j;i++) //在每一趟中进行9-j次”比较“
if(a[i]>a[i+1]) //进行比较,如果前者大于后者,则两者交换
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("排好顺序的数据为:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
运行结果如下:
输入10个整数:
1 0 4 8 12 6 -45 -67 10 3
排好顺序的数据为:
-67 -45 0 1 3 4 6 8 10 12
--------------------------------
Process exited after 36.37 seconds with return value 0
请按任意键继续. . .
上述代码有几个地方要特别注意:
for(j=0;j<9;j++) //这一步是进行9次“循环”,实现9趟“比较”
for(i=0;i<9-j;i++) //在每一趟中进行9-j次”比较“
这一步,因为整体是长度为10的数据,因此 j<9,不能为10。因为10个数两两比较只需要9 趟,即n个数只需进行n-1趟即可。而后面 i<9-j 是保证在每一趟中未排序的数字进行两两比较。每一次的比较结果将较小的数字放在上面,就像冒泡的方式一样,最终实现排序,因此叫做”冒跑排序法“。
选择排序法:
#include<stdio.h>
int main()
{
int a[10];
int i,j,t,k;
printf("输入10个整数:"); //对一维数组进行赋值
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
k=i; //k在这里只是用来记住数字在数组中的位置
for(j=i+1;j<10;j++) //目的是保证将第i个数与其后面的元素比较
if(a[j]<a[k]) //如果a[j]<a[k]
k=j; //则将最小元素的序号保存到k中
if(k!=i) //如果k值有变化
{t=a[k]; //则将最小的元素与a[i]对换
a[k]=a[i];
a[i]=t;
} //重新进入下一轮循环,直到外循环结束
}
printf("排好顺序的数据为:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
运行结果如下:
输入10个整数:
1 0 4 8 12 6 -45 -67 10 3
排好顺序的数据为:
-67 -45 0 1 3 4 6 8 10 12
--------------------------------
Process exited after 3.162 seconds with return value 0
请按任意键继续. . .
需要注意的地方:
for(i=0;i<9;i++)
{
k=i; //k在这里只是用来记住数字在数组中的位置
for(j=i+1;j<10;j++) //目的是保证将第i个数与其后面的元素比较
if(a[j]<a[k]) //如果a[j]<a[k]
k=j; //则将最小元素的序号保存到k中
if(k!=i) //如果k值有变化
{t=a[k]; //则将最小的元素与a[i]对换
a[k]=a[i];
a[i]=t;
} //重新进入下一轮循环,直到外循环结束
}
选择排序法的关键在于,它的排序机制是只记住每一个数字在原始数组中的序号,同时用k来作为一个媒介,先将一个数字的序号 i 保存在 k 中,让 a[k] 与后面的数字 a[j] 进行比较,要是出现上述的情况,则将最小元素的序号保存到 k 中,此时 k 的值就发生了改变,在通过对 k 是否变化进行判断,若变化则将最小的元素与 a[i] 对换,这样一来就保证了每一轮下来 k 中保存的值永远是最小元素的序号,从而达到排序的目的。
PS:认真的朋友应该发现了,在“冒泡排序法”和“选择排序法”的运算结果中代码处理的时间不一样。为什么?因为在理论上讲“选择排序法”比“冒泡排序法”效率要高,因为冒泡排序法无论相邻数字间是什么大小关系,都要一一进行一次对比,但是选择排序则不同。