希尔算法
A. 数据结构中希尔算法的步长因子怎么选取
没有统一的规定,但应使序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1
B. 希尔排序算法的思想是什么
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
C. 关于希尔排序 c语言
shell排序就是每隔多少个放到一个组里面进行选择排序,你改成j+ = gap ;前面的是不是应该要改成 j + gap <=n 不然会不会出现越界问题呢,我没去测试哦,你多多调试试试
D. 希尔排序
没问题
E. C++!希尔排序算法描述,求大神指点!
j-=di在排序过程中的前期阶段,看上去好像前期阶段都执行了一次,即这个循环只执行了一次,其实你如果是完整跟踪这个算法你会明白,当该算法进入排序的后期时,即di这个增量接近于1时,j-=di在for循环就不止只执行一次。至于为什么需要j-=di这个操作呢,看上去好像是多此一举,实际上这个动作是希尔排序算法关键核心之一,它可以保证不会存在有遗漏排序的现象出现。而另外一个核心就是增量的取值公式。这两个核心就构成希尔排序算法。也是希尔排序算法最难理解的地方。 该算法类似于KMP算法,关键是理解其算法思想,有时很难用语言把它描述。
F. 希尔算法,希尔算法分好组后,排序结果是怎么排出来的啊请高手指点。
你说的这个程序,其实就是要先对这五组分别排序,变为14,59 20,23 17,83 13,36 28,98
然后缩小范围,比如说排序的两个数,下标只相差4,然后再下标只相差3,一直到1;
这是我自己写的一个关于希尔排序的算法。
#include"stdio.h"
#include"stdlib.h"
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
struct Sqlist
{
ElemType *elem;
int length;
int listsize;
};
Status InitList_Sq(Sqlist &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(1);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return 1;
}
Status ListInsert_Sq(Sqlist &L,int i,ElemType e)
{
ElemType *H,*q,*p;
if(i<1||i>L.length+1)
return 0;
if(L.length>=L.listsize)
{
H=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!H)
exit(1);
L.elem=H;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i]);
p=L.elem+L.length;
for(p;p>=q;p--)
*(p+1)=*p;
*q=e;
++L.length;
return 1;
}
void Shell_Insert(Sqlist &L,int dk)
{
int i,j;
for(i=dk+1;i<=L.length;i++)
if(L.elem[i]<L.elem[i-dk])
{
L.elem[0]=L.elem[i];
for(j=i-dk;j>0 && L.elem[j]>L.elem[0];j=j-dk)
L.elem[j+dk]=L.elem[j];
L.elem[j+dk]=L.elem[0];
}
}
void Shell_Sort(Sqlist &L,int a[],int n)
{
for(int i=0;i<n;i++)
{
Shell_Insert(L,a[i]);
}
}
void Shuchu(Sqlist &L)
{
for(int i=1;i<=L.length;i++)
{
printf("%d\t",L.elem[i]);
}
printf("\n");
}
int main()
{
int a[4]={4,3,2,1};
Sqlist L;
InitList_Sq(L);
ListInsert_Sq(L,1,3);
ListInsert_Sq(L,2,5);
ListInsert_Sq(L,3,56);
ListInsert_Sq(L,4,7);
ListInsert_Sq(L,5,12);
ListInsert_Sq(L,6,35);
ListInsert_Sq(L,7,1);
ListInsert_Sq(L,8,8);
printf("排序前:\n");
Shuchu(L);
printf("排序后:\n");
Shell_Sort(L,a,4);
Shuchu(L);
return 1;
}
其实主要就是那个shell_insert和shell_sort这两个函数。好好的看看吧。
认真的看,还是能看懂的。
G. 希尔排序法特点
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因希尔于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列,由相隔某个“增量”的元素组成的,分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序,增量足够小时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,接近最好情况,效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。希尔排序法属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。希尔排序的特点
希尔排序算法与步长有直接关系。步长依次递减,数组的局部越来越有序了。希尔排序算法思想
因为希尔排序是通过比较相距一定间隔的元素来工作的。所以先要自定义步长的范围。然后选择一个当前元素,依次按照步长来寻找指定步长的元素进行比较,比较选择出最小的元素,如果比当前元素小于指定步长的元素,就进行交换,相反就退出当前的循环查找比较。
H. 希尔排序法原理
希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。
算法思想简单描述
在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,
并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为
增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除
多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现
了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中
记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量
对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成
一组,排序完成。
下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,
以后每次减半,直到增量为1。
希尔排序是不稳定的。
I. 关于希尔算法的问题程序如下:!!!
希尔排序一种分组插入排序。但就其实质就是逐步合并的过程。
先把序列分成5组,并组内排序:,,,,
再将组分成3大组:,,
然后分成2大组:,
最后:
每次合并都是最多O(n)的算法,合并的次数最多O(logn),因此希尔排序理论上是O(nlogn)的算法,但由于需要大量的数组赋值,速度并不快。