/*
*算法思想:
* 先将整个待排序元素序列分割成若干子序列,对每个子序列分别进行直接插入排序。
* 当整个待排序元素序列“基本有序”时,再对整体元素进行一次直接插入排序
*/
/*
*过程分析:
* 希尔排序在每一个子序列使用直接插入排序,若第i趟希尔排序的步长值为di,则
* 对于待插入元素r[i],需要将其余r[i-di*j]依次比较,直到完成元素的移动与插入
*/
/*
*性能分析:
* 时间复杂度为O(n^1.5)。
* 注意:增量序列有各种取法,但最后一个增量必须为1.
*/
#include <stdio.h>
#define length 9
#define deltalen 3
void ShellInsert(int *order,int di)
{
int i=0,j=0;
for(i=1+di; i<length; i++)//1+di是第一个子序列的第二个元素。i递增后就是第二个子序列的第二个元素。直到第一个子序列的第三个元素等等
if(order[i]<order[i-di])//此时采用的是从后面往前面比较
{
order[0]=order[i];//监视哨
for(j=i-di;(j>0)&&(order[0]<order[j]);j-=di)//若监视哨小于当前j位置,则j位置赋值给j的下一位置
order[j+di]=order[j];
order[j+di]=order[0];
}
return;
}
void ShellSort(int *order,int delta[],int n)//delta为希尔增量系列,n为序列长度
{
int i=0;
for(i=0;i<n;i++)
ShellInsert(order,delta[i]);
}
int main()
{
int order[length]={0,49,52,65,97,35,13,27,49};
int delta[deltalen]={4,2,1};//这个增量序列理论上可以随意选的。
//此处选择,是用order长度8依次除以2取整得到的
ShellSort(order,delta,deltalen);
int i;
for(i=1;i<length;i++)printf("%d ",order[i]);
return 0;
}
插入排序——希尔排序
最新推荐文章于 2024-06-22 21:24:43 发布
本文详细介绍了希尔排序算法的原理与实现过程。希尔排序通过先将序列分割成若干子序列并进行直接插入排序,待序列基本有序后再对整体进行一次直接插入排序。文章提供了具体的C语言实现代码,展示了希尔排序的时间复杂度为O(n^1.5),并给出了一个示例程序。
917

被折叠的 条评论
为什么被折叠?



