当前位置:首页 » 操作系统 » 希尔排序算法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]<<" ";
}
}
//主程序就麻烦自己写了

热点内容
安卓70能用什么软件 发布:2025-05-16 01:45:09 浏览:480
编程发展史 发布:2025-05-16 01:38:52 浏览:528
android图片气泡 发布:2025-05-16 01:38:40 浏览:885
文件加密编辑器下载 发布:2025-05-16 01:30:41 浏览:343
linuxapacheyum安装 发布:2025-05-16 01:30:31 浏览:476
大连宾利浴池wifi密码是多少 发布:2025-05-16 01:25:36 浏览:172
缓存数据生产服务 发布:2025-05-16 01:08:58 浏览:584
普通电脑服务器图片 发布:2025-05-16 01:04:02 浏览:971
服务器地址和端口如何区分 发布:2025-05-16 01:03:17 浏览:834
重新编目数据库 发布:2025-05-16 00:54:34 浏览:514