❶ 希尔排序问题
是49上面有一横。这是因为有两个49。加一横是为了区分它们。
❷ 关于希尔算法的问题程序如下:!!!
希尔排序一种分组插入排序。但就其实质就是逐步合并的过程。
先把序列分成5组,并组内排序:,,,,
再将组分成3大组:,,
然后分成2大组:,
最后:
每次合并都是最多O(n)的算法,合并的次数最多O(logn),因此希尔排序理论上是O(nlogn)的算法,但由于需要大量的数组赋值,速度并不快。
❸ 希尔排序法特点
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因希尔于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列,由相隔某个“增量”的元素组成的,分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序,增量足够小时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,接近最好情况,效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。希尔排序法属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。希尔排序的特点
希尔排序算法与步长有直接关系。步长依次递减,数组的局部越来越有序了。希尔排序算法思想
因为希尔排序是通过比较相距一定间隔的元素来工作的。所以先要自定义步长的范围。然后选择一个当前元素,依次按照步长来寻找指定步长的元素进行比较,比较选择出最小的元素,如果比当前元素小于指定步长的元素,就进行交换,相反就退出当前的循环查找比较。
❹ 希尔排序
没问题
❺ 希尔排序法原理
希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。
算法思想简单描述
在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,
并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为
增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除
多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现
了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中
记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量
对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成
一组,排序完成。
下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,
以后每次减半,直到增量为1。
希尔排序是不稳定的。
❻ 谁能给我解释一下希尔排序算法
我用C给你写一个吧
void ShellSort(int *a, int n)
{
//循环变量
int i = 0;
int j = 0;
//控制增量
int k = n / 2;
int temp = 0;
while (k > 0)
{
for (i = k; i < n; i += k)
{
temp = a[i];
for (j = i - k; j >= 0 && temp < a[j]; j -= k)
{
a[j + k] = a[j];
}
a[j + k] = temp;
}
k /= 2;
}
❼ 希尔排序的详解
希尔排序基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
举例说明:
对于这样一个无序的数组5932611817410,想把它变成顺序递增的数组1234567891011。先隔3个元素取一次:把5284取了出来,往后搓一位,把96110取出来,再往后搓一位,又把3117取出来。分别对这三个小组排序成为递增的序列,再插回去,如图:
于是得到了第一趟排序的结果:2134675911810.现在再以2为间隔重复以上步骤(这次得到的是两个小组)得到了2134576811910。最后再以1为间隔再搞一次(实际上这一步就是从左到右两两比较,调整位置),就得到了想要的结果。
这就是希尔排序,其要义就是先进行宏观调整,再进行微观调整。
❽ C++!希尔排序算法描述,求大神指点!
j-=di在排序过程中的前期阶段,看上去好像前期阶段都执行了一次,即这个循环只执行了一次,其实你如果是完整跟踪这个算法你会明白,当该算法进入排序的后期时,即di这个增量接近于1时,j-=di在for循环就不止只执行一次。至于为什么需要j-=di这个操作呢,看上去好像是多此一举,实际上这个动作是希尔排序算法关键核心之一,它可以保证不会存在有遗漏排序的现象出现。而另外一个核心就是增量的取值公式。这两个核心就构成希尔排序算法。也是希尔排序算法最难理解的地方。 该算法类似于KMP算法,关键是理解其算法思想,有时很难用语言把它描述。
❾ 希尔算法,希尔算法分好组后,排序结果是怎么排出来的啊请高手指点。
你说的这个程序,其实就是要先对这五组分别排序,变为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这两个函数。好好的看看吧。
认真的看,还是能看懂的。