程序实现对数组序列从大到小的排列,并输出排序后的数列元素,代码如下所示:
#include"stdio.h"
insertsort(int a[],int n) /*直接插入排序*/
{
int i,j;
for(i=2;i<=n;i++){
a[0]=a[i];
j=i-1;
while(j>0 && a[0]>a[j]) /*改变判断条件,实现从大到小地排列*/
a[j+1] = a[j--];
a[j+1] = a[0]; /*将元素a[0]插入指定位置*/
}
}
main()
{
int i,a[11] = {-111,2,5,6,3,7,8,0,9,12,1}; /*初始化序列,a[0]可任意置数*/
printf("The orginal data array is\n");
for(i=1;i<=10;i++) /*显示原序列之中的元素*/
printf("%d ",a[i]);
insertsort(a,10); /*插入排序*/
printf("\nThe result of insertion sorting for the array is\n");
for(i=1;i<=10;i++)
printf("%d ",a[i]); /*输出排序后的结果*/
getche();
}
程序运行的结果如下图所示:
对实例的分析:
本程序很简单,就是实现了一个直接插入排序的函数。没啥可分析的,不过对于像我这种菜鸟来说,可能记忆各种排序方法是最困难的,在这里我就尝试着给大家讲一讲,也当让自己加深一些印象。
直接插入排序的思想就是把数据元素逐一插入到已经排列好的数列当中,所以在这里会用到一个临时变量(或者说数组当中的一个位置)来存放排序当中的最大值或者最小值,在程序当中用第一个位置,也就是a[0]来存放。而a[0]第一次存放的是第几个元素呢?是第二个,为啥不是第一个呢?(就一个元素你还比较个球啊,吼吼!)。
之后我们就开始比较了,每一趟比较的过程我们都是先把这一趟应该比较的最后一个元素的值赋给临时变量,之后用临时变量与应该比较的最后一个元素的前一个元素开始从后往前比较。在本程序中,如果临时变量比比较的元素大,那么就把比较的元素往后挪,由于排序是从两个元素开始依次增多,这就保证了每次插入一个位置而不会因为位置移动而造成其他元素的大小混乱。
最后把临时变量赋给它应该在的位置上。
总结:
个人认为,直接插入排序是除了冒泡排序之外最好理解的排序方法了,所以大家只要仔细多琢磨琢磨程序的话,写出来是很简单的!