您的位置:首页 > 编程语言 > C语言/C++

c语言实现插入排序

2015-05-19 15:38 281 查看
插入排序思想如下,一列数字中将第一个数看作是已排好顺序的,所以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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  插入排序 c语言