c语言实现插入排序

插入排序思想如下,一列数字中将第一个数看作是已排好顺序的,所以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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值