當前位置:首頁 » 操作系統 » 希爾排序演算法c

希爾排序演算法c

發布時間: 2022-08-25 06:06:22

A. 希爾排序,選擇排序,插入排序,堆排序的c語言實現

希爾排序演算法

void Shellinsert ( SqList &L, int dk ) {

// 對順序表 L 作一趟希爾插入排序。此演算法和一趟直接插入排序相比,作了以下修改:

// (1) 前後記錄為止的增量是 dk,而不是 1;

// (2) r[0] 只是暫存單元,而不是哨兵。當 j <= 0 時,插入位置已經找到。

for ( i = dk+1; i <=L.length; ++i )

if ( L.r[i].key < L.r[i-dk].key ) { // 需要將 L.r[i] 插入有序增量子表

L.r[0] = L.r[i]; // 暫存在 L.r[0]

for ( j = i-dk; j > 0 && ( L.r[0].key < L.r[j].key ); j -= dk )

L.r[j+dk] = L.r[j]; // 記錄後移,查找插入位置

L.r[j+dk] = L.r[0]; // 插入到正確位置

} // if 結束

} // ShellInsert

B. c語言希爾排序

voidShellInsertSort(inta[],intn,intdk)
{
for(inti=dk;i<n;++i){
if(a[i]<a[i-dk]){//若第i個元素大於i-1元素,直接插入。小於的話,移動有序表後插入
intj=i-dk;
intx=a[i];//復制為哨兵,即存儲待排序元素
a[i]=a[i-dk];//首先後移一個元素
while(x<a[j]){//查找在有序表的插入位置
a[j+dk]=a[j];
j-=dk;//元素後移
}
a[j+dk]=x;//插入到正確位置
}
}

}

/**
*先按增量d(n/2,n為要排序數的個數進行希爾排序
*
*/
voidshellSort(inta[],intn){

intdk=n/2;
while(dk>=1){
ShellInsertSort(a,n,dk);
dk=dk/2;
}
}

C. C語言數據結構希爾排序

void main()
{
datatype R[MAXNUM];
int d[6]=[50,25,12,6,3,2,1];

for(int i=0;i<MAXNUM;i++)
scanf("%d",&R[i].key);
ShellSort(R,MAXNUM,d,6);
for(int i=0;i<MAXNUM;i++)
printf("%d",R[i].key);
}

D. 用c語言編寫一個希爾排序程序,新手,最好能給注釋下!謝謝

網友wang1992092對希爾排序的理解有些錯誤,希爾排序對每個子序列進行的是直接插入排序,而不是如他所給出的選擇排序。你可以先網路一下希爾排序的定義。我這里給一個C源代碼,你可以試試。直接插入排序的思路是:將待排表分成兩部分,一部分是已有序部分L,另一部分是待排序部分R。L初始化為只含第一個元素的表,因L現在只含一個元素,所以是有序的。然後每次從R中取出最前面的元素到tmp(相當於出隊到tmp中),然後在L中從後向前搜索插入位置,邊搜索邊向後移動比tmp大的元素,找到了插入位置後就將tmp插入到L中。直到R部分為空時結束。
typedef int datatype;
void InsertSort(datatype a[], int left, int right, int gap)
/*對數組a中起始下標為left,結束下標為right,步長為gap的子序列進行直接插入排序,當gap等於1時就是通常的插入排序了*/
{
int tmp, i, j;
for(i = left + gap; i <= right; i += gap){
for(tmp = a[i], j = i - gap; j >= left && a[j] > tmp; j -= gap)
a[j + gap] = a[j];
a[j + gap] = tmp;
}
}

void ShellSort(datatype a[], int left, int right)
{
int gap = (right - left + 1) / 2, i;/*步長gap初始化為n/2取下整*/
while(gap > 0)
{
for(i = left; i < gap; i++) /*對每個子序列進行直接插入排序*/
InsertSort(a, i, right, gap);
gap = gap / 2; /*將步長縮小為原來的一半並取下整*/
}
}

E. C-數據結構 希爾排序

int main()
{
int n,a[maxsize],i;
int j,t,d[maxsize];
printf("--希爾排序\n");
//下面兩個輸入是輸入數組的值
printf("Input the number of the elements:");
scanf("%d",&n);
printf("And input the elements:",n);
for(j=0;j<n;j++)
scanf("%d",&a[j]);

//輸入希爾排序每次間隔的大小
printf("Input the time of the options:");
scanf("%d",&t);
printf("And input these options:");
for(i=1;i<=t;i++)
scanf("%d",&d[i]);

shell_sort(a,n,d,t); //調用希爾排序的函數,裡面不需要【】

for(j=0;j<n;j++)
printf("%d ",a[j]);
system("pause");
return 0;
}

//我感覺這段程序有點錯誤

F. 希爾排序(c語言)

void ShellSort(int r[],int n)//希爾排序
{
for(int gap=n/2;gap>=1;gap=gap/2)//以增量為d進行直接插入排序
{
CountCompare[1]++;
for(int i=d+1;i<=n;i++)//將r[i]插入到所屬的子序列中
{
r[0]=r[i];//暫存被插入記錄
CountMove[1]++;
for(int j=i-d;j>0&&r[0]<r[j];j=j-gap)
{
r[j+d]=r[j];//記錄後移gap個位置,保證仍在同一個子序列
CountCompare[1]++;
CountMove[1]++;
}
r[j+gap]=r[0];
CountMove[1]++;
}
for(int k=1;k<=n;k++)
cout<<r[i]<<" ";
}
}
//主程序就麻煩自己寫了

熱點內容
緩存數據生產服務 發布:2025-05-16 01:08:58 瀏覽:583
普通電腦伺服器圖片 發布:2025-05-16 01:04:02 瀏覽:970
伺服器地址和埠如何區分 發布:2025-05-16 01:03:17 瀏覽:833
重新編目資料庫 發布:2025-05-16 00:54:34 瀏覽:513
android語音控制 發布:2025-05-16 00:53:50 瀏覽:265
win8windows無法訪問 發布:2025-05-16 00:37:53 瀏覽:894
八種排序演算法 發布:2025-05-16 00:37:17 瀏覽:55
左旋螺紋數控編程實例 發布:2025-05-16 00:11:49 瀏覽:10
安卓游戲舊版本從哪個軟體下載 發布:2025-05-16 00:00:20 瀏覽:329
連接聚類演算法 發布:2025-05-15 23:55:09 瀏覽:978