插入排序(希尔排序、直接插入、折半插入排序)

希尔排序:(我自己的理解,刚开始进行算法学习,希望大家可以指点)
插入排序最好情况下是整个数的序列是有序的(因为不用进行数的移动),而希尔排序就是利用了这一点
1、当只有一个数时,不需要进行排序,有两个数时,只需要这两个数简单的进行比较,如果前边的大于后边的(默认升序排列),两者就互换位置即可,这样比较简单易懂,因此,刚
开始以两个数为一组,然后用数列长度除以2得到第一次进行希尔排序的步长,进行排序,然后步长依次递减。

2、当步长为1时,此时整个数列已经基本有序(此时已经接近于插入排序性能最优的情况)

代码:

#include<stdio.h>
void ShellInsert(int a[], int len,int delta)
{
int i;
int j;
for (i = 1+delta; i <= len; i++)
{
a[0] = a[i];
j = i-delta;
while (j >= 1 &&  a[0] < a[j])
{
a[j+delta] = a[j];
j -= delta;
}
a[j + delta] = a[0];
}
}
void ShellSort(int a[],int len,int delta[],int n)
{
int i;
for (i = 0; i < n; i++)
{
ShellInsert(a,len,delta[i]);
}
}
int main(void)
{
int i;
int a[11] = { 0, 34, 25, 76, 54, 14, 66, 21, 65, 38, 67 };
int delta[5] = { 5, 4, 3, 2, 1 };
ShellSort(a, 10, delta, 5);
for (i = 1; i <= 10; i++)
{
printf("%4d",a[i]);
}
printf("\n");
}

直接插入排序:

#include<stdio.h>


//升序
void InsSort(int a[], int len)
{
int i;
int j;
for (i = 2; i <= len; i++)
{
a[0] = a[i];
j = i;
while (a[0] < a[j - 1])
{
a[j] = a[j - 1];
j--;
}
a[j] = a[0];
}
}
#if 0
int main(void)
{
int a[] = { 0,2, 5, 6, 4 };
int i;
InsSort(a, 4);
for (i = 1;   i <= 4; i++)
{
printf("%4d",a[i]);
}
printf("\n");


return 0;
}
#endif


折半插入排序:

#include<stdio.h>
//升序
void BinSort(int a[],int len)
{
int i;
int low, high;
int mid;
int j;
int key;
for (i = 2; i <= len; i++)
{
key = a[i];
low = 1;
high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] > a[i])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
for (j = i - 1; j >= low; j--)
{
a[j + 1] = a[j];
}
a[low] = key;
}
}
#if 0
int main(void)
{
int a[] = { 0, 2, 5, 6, 4 };
int i;
BinSort(a, 4);
for (i = 1; i <= 4; i++)
{
printf("%4d",a[i]);
}
printf("\n");
return 0;
}
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值