插入排序.c

 插入排序分为直接排序和希尔排序两种:

//直接排序

void InsertSort(DataType a[ ],int n)

{

 int i,j;

DataType temp;

for(i=0;i<n-1;i++)

{

temp=a[i+1];

j=i;

while(j!=-1 && temp.key<a[j].key)

{

a[j+1]=a[j];

j--;

}

a[j+1]=temp;

}

}


插入排序分析:

   该函数传入待排序的数组,还有数组元素的个数。

首先,第一层循环为n-1次,即共循环比较n-1次,因为最后一个剩下的元素已不需要比较。

进入第一次循环后,先是用temp把待排序元素的下一位记录下来,j把待排序元素的下标记录下来,

然后进入第二层循环while(j!=-1 && temp.key<a[j].key):如果temp的值比a[j]的值小,就把a[j]往后移,依次后移直到顺序排序,

因为除了j之外,其他元素都已作出变动,所以要把较小的temp的值重新赋给a[j]。此时的j因为多减了一次,所以需要j++。


//希尔排序

void ShellSort(DataType a[],int n,int d[],int numOfD)

{

DataType temp;

int i,j,k,span,m;

for(i=0;i<numOfD;i++) //共numOfD个希尔增量

{

span=d[m]; //取一个的希尔增量为span

for(k=0;i<span;k++) //每一个希尔增量代表的是把元素划分为span个组,每个小组里元素差值为span

{

for(j=k;j<n-span;j=j+span)

{

tenp=a[j+span];

m=j;

while(m!=-1 && temp.key<a[m].key)

{

a[m+span]=a[m];

m-span;

}

a[m+span]=temp;

}

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值