希爾演算法
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)的演算法,但由於需要大量的數組賦值,速度並不快。