插入排序思想如下,一列数字中将第一个数看作是已排好顺序的,所以i从第二个开始,如果i比第一个数小,那么将i和第一个数字换位置,所以這里我们需要借助一个temp位,来达到两数换位置,在這里,我们将数组Data[0]看作是temp位,以两个数的数组data为例,/假设第二个数比第一个数字小,那么将第二个数字复制到data[0]中,然后将第一个数复制到第二个数中,将data[0]在复制到第一个数data[1]中,data[0]就相当于哨兵,若数组数多于两个,道理也是一样的,一个数字data[i]若比前一个数字data[i-1]小,则复制到data[0]中,然后从data[i-1]依次向前开始做比较,比data[0]大,则往后移动一个,直到比较不成功,便将data[0]中的数字复制到比较不成功的位置。在這个程序里要特别注意--j和j--的区别,一旦for循环比较不成功,j-1之后跳出循环,所以是data[j+1]=dtat[0],在這里,j--和--j效果是一样的。时间复杂度O(n^2),是稳定的排序方法。代码如下:
#include <stdio.h>
typedef struct
{
int key;
char name[10];
}Data;
Data ListOld[]={{0,"num0"},{49,"num1"},{38,"num2"},{65,"num3"},{97,"num4"},{76,"num5"},{13,"num6"},{27,"num7"},{49,"num8"}};
void InsertSort(Data *pdata,int n);
void PrintData(Data *pdata,int n);
int main(int argc, char *argv[])
{
printf("Hello, world\n");
InsertSort(ListOld,9);
return 0;
}
void PrintData(Data *pdata,int n)
{
int i;
for(i=1;i<n;i++){
printf("%d,%s ",pdata[i].key,pdata[i].name);
}
printf("\n");
}
void InsertSort(Data *pdata,int n)
{
int i,j;
for(i=2;i<=n;i++){
if(pdata[i].key < pdata[i-1].key)
{
pdata[0] = pdata[i];
for(j=i-1;pdata[0].key < pdata[j].key;--j){
pdata[j+1] = pdata[j];
//printf("%d ",j);说明j是从1开始执行的;
}
pdata[j+1] = pdata[0];
}
}
PrintData(ListOld,9);
}