希尔排序算法

发布网友 发布时间:2022-04-27 00:32

我来回答

5个回答

热心网友 时间:2022-05-10 11:23

修改如下:
添加了shellsort()函数.
对main()函数,paixu()函数,rangerand()函数作了修改

修改后的程序如下:
//---------------------------------------------------------------------------
#include<stdio.h> //printf,scanf
#include<stdlib.h> //system,srand,rand
#include<time.h>

void main(){
//================================子函数声明及说明=================================//
void head(); //操作提示
void print(long R[],long n);//输出数组中的元素
void insertsort(long R[],long n,long *bj1,long *yd1); //直接插入排序函数
void shellsort(long a[],long n,long *bj5,long *yd5); //Shell排序函数
void Bubblesort(long R[],long n,long *bj2,long *yd2); //冒泡排序函数
void quicksort(long R[], long low, long high,long *bj3,long *yd3); //快速排序函数
void selectsort(long R[],long n,long *bj4,long *yd4); //简单选择排序函数
void paixu(long R1[],long R2[],long R3[],long R4[],long N); //进行排序并计时
void rangerand(long *n); //产生随机数,并排序
int ensure(); //退出确认函数
void knowledge(); //算法相关知识
void help(); //程序使用说明
//==================================声明结束======================================//
head();
long N;
char xz;
int flag=1,c;
while(flag)
{
scanf("%c%*c",&xz);
switch(xz)
{
case '0':
system("cls");
head();
break;
case '1':
rangerand(&N);
head();
break;
case '2':
knowledge();
head();
break;
case '3':
help();
head();
break;
case '4':
c=ensure();
if(c) head();
else flag=c;
break;
default:
printf("\n !提示:请输入一位0~4的数字!\n 请重新输入选择的操作:");
break;
}
}//while循环结束
}

void head(){
//软件使用交互部分
printf(" \n =========================================================\n");
printf(" 排序算法的比较\n ——直接插入、冒泡、快速、简单选择排序\n");
printf(" =========================================================\n");
printf(" 可执行的操作:\n");
printf(" 0.清屏 \n");
printf(" 1.生成随机数并排序 \n");
printf(" 2.相关算法知识 \n");
printf(" 3.使用说明 \n");
printf(" 4.退出\n");
printf(" 请选择(0~4):");

}

void print(long R[],long n){
//输出数组中的元素
for(long i=0;i<n;i++)
{
printf("%7ld",R[i]);
if(i%10==9) printf("\n");
}
printf("\n");
}

//===============四个排序算法核心,排序并记录比较次数============================//

void insertsort(long R[],long n,long *bj1,long *yd1){
//以下为直接插入排序.待排序元素用一个数组R表示,数组有n个元素

for(long i=1;i<n;i++) //i表示插入次数,共进行n-1次插入
{
int temp=R[i]; //把待排序元素赋给temp
long j=i-1;
while((j>=0)&&(temp<R[j]))
{
(*bj1)++;
(*yd1)++;
R[j+1]=R[j];
j--; //顺序比较和移动
}
R[j+1]=temp;
(*bj1)++;
}
}

void Bubblesort(long R[],long n,long *bj2,long *yd2){
//以下为冒泡排序
int flag=1; //当flag为0,则停止排序
for(long i=1;i<n;i++) //i表示趟数,最多n-1趟
{
flag=0; //开始时元素未交换
for(long j=n-1;j>=i;j--)
{
if(R[j]<R[j-1]) //发生逆序
{
int t=R[j];
R[j]=R[j-1];
R[j-1]=t;flag=1; //交换,并标记发生了交换
(*yd2)++;
}
(*bj2)++;
}
if(flag==0) break;
}
}

void quicksort(long R[], long low, long high,long *bj3,long *yd3) {
//以下为快速排序
long i, j, pivot;
if (low < high)
{
pivot=R[low];
i=low;
j=high;
while(i<j)
{
while (i<j && R[j]>=pivot)
{
j--;
(*bj3)++;
}
if(i<j)
{
R[i++]=R[j];
(*yd3)++;
} //将比枢轴记录小的记录移到低端
while (i<j && R[i]<=pivot)
{
i++;
(*bj3)++;
}
if(i<j)
{
R[j--]=R[i]; //将比枢轴记录大的记录移到高端
(*yd3)++;
}
}
R[i]=pivot; //枢轴记录移到最终位置
quicksort(R,low,i-1,bj3,yd3);
quicksort(R,i+1,high,bj3,yd3);
}
}

void selectsort(long R[],long n,long *bj4,long *yd4){
//以下为简单选择排序
long i,j,m;int t;
for(i=0;i<n-1;i++)
{
m=i;
for(j=i+1;j<n;j++)
{
if(R[j]<R[m]) m=j; //用m定位最小值
(*bj4)++;
}
if(m!=i) //逆序,移动
{
t=R[i];
R[i]=R[m];
R[m]=t;
(*yd4)++;
}
}
}
void shellsort(long a[],long n,long *bj5,long *yd5)
{

long i, j, gap, temp;

while (gap * 3 + 1<=n)
{
gap=gap * 3 + 1;
}
while (gap > 0)
{
for ( i = gap; i < n; i++ )
{
j = i - gap;
temp = a[i];
while (( j >= 0 ) && ( a[j] > temp ))
{
a[j + gap] = a[j];
j = j - gap;
(*bj5)++;
(*yd5)++;
}
a[j + gap] = temp;
(*yd5)++;
}
gap = ( gap - 1 ) /3;
}

}

//==================================================================//

void paixu(long R1[],long R2[],long R3[],long R4[],long R5[],long N){
//排序并计时
char tj;
clock_t start, finish;
long t1,t2,t3,t4,t5;
long bj1=0,bj2=0,bj3=0,bj4=0,bj5=0;
long yd1=0,yd2=0,yd3=0,yd4=0,yd5=0;

start = clock(); //记录初始时间
insertsort(R1,N,&bj1,&yd1); //执行算法
finish = clock(); //记录终止时间
t1 = (finish - start) ; //计算算法执行时间
printf("排序结果:\n");
printf(" 直接插入排序:\n");
print(R1,N);

system("pause"); //屏幕显示"请按任意键继续…"
start = clock();
shellsort(R5,N,&bj5,&yd5);
finish = clock();
t5 = (finish - start) ;
printf(" Shell排序:\n");
print(R5,N);

system("pause"); //屏幕显示"请按任意键继续…"
start = clock();
Bubblesort(R2,N,&bj2,&yd2);
finish = clock();
t2 = (finish - start) ;
printf(" 冒泡排序:\n");
print(R2,N);

system("pause");
start = clock();
quicksort(R3,0,N-1,&bj3,&yd3);
finish = clock();
t3 = (finish - start) ;
printf(" 快速排序:\n");
print(R3,N);

system("pause");
start = clock();
selectsort(R4,N,&bj4,&yd4);
finish = clock();
t4 = (finish - start) ;
printf(" 简单选择排序:\n");
print(R4,N);

printf(" 按回车键查看统计信息...\n");
scanf("%*c",&tj);
printf(" 统计:此次共对%ld个随机数进行了排序\n",N);
printf(" 排序用时 比较次数 移动次数 \n");
printf( " 直接插入 排序 |%5d 毫秒|%10ld次|%10ld次|\n", t1,bj1,yd1);
printf( " Shell 排序 |%5d 毫秒|%10ld次|%10ld次|\n", t5,bj5,yd5);
printf( " 冒 泡 排序 |%5d 毫秒|%10ld次|%10ld次|\n", t2,bj2,yd2);
printf( " 快 速 排序 |%5d 毫秒|%10ld次|%10ld次|\n", t3,bj3,yd3);
printf( " 简单选择 排序 |%5d 毫秒|%10ld次|%10ld次|\n\n", t4,bj4,yd4);
system("pause");
}

void rangerand(long *n){
//对随机数进行排序
long m;int pd=1;char px;
long Origine[32767],R1[32767],R2[32767],R3[32767],R4[32767],R5[32768];
printf(" 请输入产生随机数的个数(1~32767): ");
while(pd)
{
scanf("%ld%*c",n);
printf("\n");
if((*n)>0&&(*n)<32768) pd=0;
else printf("提示:请输入1~32767之间的数字!\n请重新输入产生随机数的个数(1~32767): ");
}
srand((unsigned)time(NULL));
for(m=0;m<*n;m++)
{
Origine[m]=rand();//产生随机数
R1[m]=Origine[m];
R2[m]=Origine[m];
R3[m]=Origine[m];
R4[m]=Origine[m];
R5[m]=Origine[m];
}
printf(" 产生的随机数为:\n");
print(Origine,*n); //输出随机数
printf(" 按回车键开始排序...");
scanf("%*c",&px);
paixu(R1,R2,R3,R4,R5,*n);

}

int ensure(){
//确认退出
char qr;
printf(" 确定要退出本程序?(y/n)");
scanf("%c%*c",&qr);
if(qr=='y') return 0;
else return 1;
}

void knowledge(){
//算法的简要说明
printf("\n 直接插入、冒泡、快速、简单选择排序相关知识:\n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" 直接插入、冒泡、简单选择排序的平均时间、最坏情况均为O(n^2),\n\
快速排序的平均时间为O(nlogn),最坏时间为O(n^2);\n\
一般待排序数较少时用前三种排序,而随机数较多时,快速排序的优势明显;\n\
这四种排序中只有快速排序是不稳定的。\n\n\n");
system("pause");
}

void help(){
//使用说明
printf("\n 程序说明:\n\
~~~~~~~~~\n\
设计目的:通过对相关参数的比较加深对排序算法的理解;\n\
输入:操作号;待排序随机数的个数;确认操作等\n\
输出:各算法的排序时间、比较次数、移动次数。\n\n\n");
system("pause");
}

//---------------------------------------------------------------------------

热心网友 时间:2022-05-10 12:41

#include<stdio.h> //printf,scanf
#include<stdlib.h> //system,srand,rand
#include<time.h>

void main(){
//================================子函数声明及说明=================================//
void head(); //操作提示
void print(long R[],long n);//输出数组中的元素
void insertsort(long R[],long n,long *bj1,long *yd1); //直接插入排序函数
void Bubblesort(long R[],long n,long *bj2,long *yd2); //冒泡排序函数
void quicksort(long R[], long low, long high,long *bj3,long *yd3); //快速排序函数
void selectsort(long R[],long n,long *bj4,long *yd4); //简单选择排序函数
void paixu(long R1[],long R2[],long R3[],long R4[],long N); //进行排序并计时
void rangerand(long *n); //产生随机数,并排序
int ensure(); //退出确认函数
void knowledge(); //算法相关知识
void help(); //程序使用说明
//==================================声明结束======================================//
head();
long N;
char xz;
int flag=1,c;
while(flag)
{
scanf("%c%*c",&xz);
switch(xz)
{
case '0':
system("cls");
head();
break;
case '1':
rangerand(&N);
head();
break;
case '2':
knowledge();
head();
break;
case '3':
help();
head();
break;
case '4':
c=ensure();
if(c) head();
else flag=c;
break;
default:
printf("\n !提示:请输入一位0~4的数字!\n 请重新输入选择的操作:");
break;
}
}//while循环结束
}

void head(){
//软件使用交互部分
printf(" \n =========================================================\n");
printf(" 排序算法的比较\n ——直接插入、冒泡、快速、简单选择排序\n");
printf(" =========================================================\n");
printf(" 可执行的操作:\n");
printf(" 0.清屏 \n");
printf(" 1.生成随机数并排序 \n");
printf(" 2.相关算法知识 \n");
printf(" 3.使用说明 \n");
printf(" 4.退出\n");
printf(" 请选择(0~4):");

}

void print(long R[],long n){
//输出数组中的元素
for(long i=0;i<n;i++)
{
printf("%7ld",R[i]);
if(i%10==9) printf("\n");
}
printf("\n");
}

//===============四个排序算法核心,排序并记录比较次数============================//

void insertsort(long R[],long n,long *bj1,long *yd1){
//以下为直接插入排序.待排序元素用一个数组R表示,数组有n个元素

for(long i=1;i<n;i++) //i表示插入次数,共进行n-1次插入
{
int temp=R[i]; //把待排序元素赋给temp
long j=i-1;
while((j>=0)&&(temp<R[j]))
{
(*bj1)++;
(*yd1)++;
R[j+1]=R[j];
j--; //顺序比较和移动
}
R[j+1]=temp;
(*bj1)++;
}
}

void Bubblesort(long R[],long n,long *bj2,long *yd2){
//以下为冒泡排序
int flag=1; //当flag为0,则停止排序
for(long i=1;i<n;i++) //i表示趟数,最多n-1趟
{
flag=0; //开始时元素未交换
for(long j=n-1;j>=i;j--)
{
if(R[j]<R[j-1]) //发生逆序
{
int t=R[j];
R[j]=R[j-1];
R[j-1]=t;flag=1; //交换,并标记发生了交换
(*yd2)++;
}
(*bj2)++;
}
if(flag==0) break;
}
}

void quicksort(long R[], long low, long high,long *bj3,long *yd3) {
//以下为快速排序
long i, j, pivot;
if (low < high)
{
pivot=R[low];
i=low;
j=high;
while(i<j)
{
while (i<j && R[j]>=pivot)
{
j--;
(*bj3)++;
}
if(i<j)
{
R[i++]=R[j];
(*yd3)++;
} //将比枢轴记录小的记录移到低端
while (i<j && R[i]<=pivot)
{
i++;
(*bj3)++;
}
if(i<j)
{
R[j--]=R[i]; //将比枢轴记录大的记录移到高端
(*yd3)++;
}
}
R[i]=pivot; //枢轴记录移到最终位置
quicksort(R,low,i-1,bj3,yd3);
quicksort(R,i+1,high,bj3,yd3);
}
}

void selectsort(long R[],long n,long *bj4,long *yd4){
//以下为简单选择排序
long i,j,m;int t;
for(i=0;i<n-1;i++)
{
m=i;
for(j=i+1;j<n;j++)
{
if(R[j]<R[m]) m=j; //用m定位最小值
(*bj4)++;
}
if(m!=i) //逆序,移动
{
t=R[i];
R[i]=R[m];
R[m]=t;
(*yd4)++;
}
}
}
//==================================================================//

void paixu(long R1[],long R2[],long R3[],long R4[],long N){
//排序并计时
char tj;
clock_t start, finish;
long t1,t2,t3,t4;
long bj1=0,bj2=0,bj3=0,bj4=0;
long yd1=0,yd2=0,yd3=0,yd4=0;

start = clock(); //记录初始时间
insertsort(R1,N,&bj1,&yd1); //执行算法
finish = clock(); //记录终止时间
t1 = (finish - start) ; //计算算法执行时间
printf("排序结果:\n");
printf(" 直接插入排序:\n");
print(R1,N);

system("pause"); //屏幕显示"请按任意键继续…"
start = clock();
Bubblesort(R2,N,&bj2,&yd2);
finish = clock();
t2 = (finish - start) ;
printf(" 冒泡排序:\n");
print(R2,N);

system("pause");
start = clock();
quicksort(R3,0,N-1,&bj3,&yd3);
finish = clock();
t3 = (finish - start) ;
printf(" 快速排序:\n");
print(R3,N);

system("pause");
start = clock();
selectsort(R4,N,&bj4,&yd4);
finish = clock();
t4 = (finish - start) ;
printf(" 简单选择排序:\n");
print(R4,N);

printf(" 按回车键查看统计信息...\n");
scanf("%*c",&tj);
printf(" 统计:此次共对%ld个随机数进行了排序\n",N);
printf(" 排序用时 比较次数 移动次数 \n");
printf( " 直接插入 排序 |%5d 毫秒|%10ld次|%10ld次|\n", t1,bj1,yd1);
printf( " 冒 泡 排序 |%5d 毫秒|%10ld次|%10ld次|\n", t2,bj2,yd2);
printf( " 快 速 排序 |%5d 毫秒|%10ld次|%10ld次|\n", t3,bj3,yd3);
printf( " 简单选择 排序 |%5d 毫秒|%10ld次|%10ld次|\n\n", t4,bj4,yd4);
system("pause");
}

void rangerand(long *n){
//对随机数进行排序
long m;int pd=1;char px;
long Origine[32767],R1[32767],R2[32767],R3[32767],R4[32767];
printf(" 请输入产生随机数的个数(1~32767): ");
while(pd)
{
scanf("%ld%*c",n);
printf("\n");
if((*n)>0&&(*n)<32768) pd=0;
else printf("提示:请输入1~32767之间的数字!\n请重新输入产生随机数的个数(1~32767): ");
}
srand((unsigned)time(NULL));
for(m=0;m<*n;m++)
{
Origine[m]=rand();//产生随机数
R1[m]=Origine[m];
R2[m]=Origine[m];
R3[m]=Origine[m];
R4[m]=Origine[m];
}
printf(" 产生的随机数为:\n");
print(Origine,*n); //输出随机数
printf(" 按回车键开始排序...");
scanf("%*c",&px);
paixu(R1,R2,R3,R4,*n);

}

int ensure(){
//确认退出
char qr;
printf(" 确定要退出本程序?(y/n)");
scanf("%c%*c",&qr);
if(qr=='y') return 0;
else return 1;
}

void knowledge(){
//算法的简要说明
printf("\n 直接插入、冒泡、快速、简单选择排序相关知识:\n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" 直接插入、冒泡、简单选择排序的平均时间、最坏情况均为O(n^2),\n\
快速排序的平均时间为O(nlogn),最坏时间为O(n^2);\n\
一般待排序数较少时用前三种排序,而随机数较多时,快速排序的优势明显;\n\
这四种排序中只有快速排序是不稳定的。\n\n\n");
system("pause");
}

void help(){
//使用说明
printf("\n 程序说明:\n\
~~~~~~~~~\n\
设计目的:通过对相关参数的比较加深对排序算法的理解;\n\
输入:操作号;待排序随机数的个数;确认操作等\n\
输出:各算法的排序时间、比较次数、移动次数。\n\n\n");
system("pause");
}

热心网友 时间:2022-05-10 14:16

不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度为 O(N*(logN)2), 没有快速排序算法快 O(N*(logN)),因此中等大小规模表现良好,对规模非常大的数据排序不是 最优选择。但是比O(N2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏 的情况下执行的效率会非常差。 专家门提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快, 再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法的一种改进,减少了其复制的次数,速度要快很多。 原因是,当N值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。 当N值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。

参考资料:http://ke.baidu.com/view/2217047.html?wtp=tt

热心网友 时间:2022-05-10 16:07

如果“完全”看不懂,说明你没有看该算法的介绍文本,建议去仔细地看一下!然后对照此程序(如有条件可以对此程序进行单步跟踪运行以观察其运行方式)理解该算法
Gap=8:462
17
512
908
170
7
275
653
503
154
509
612
677
765
703
94
Gap=8:462
17
512
908
170
7
275
653
503
154
509
612
677
765
703
94
Gap=8:462
17
509
908
170
7
275
653
503
154
512
612
677
765
703
94
Gap=8:462
17
509
612
170
7
275
653
503
154
512
908
677
765
703
94
Gap=8:462
17
509
612
170
7
275
653
503
154
512
908
677
765
703
94
Gap=8:462
17
509
612
170
765
275
653
503
154
512
908
677
7
703
94
Gap=8:462
17
509
612
170
765
275
653
503
154
512
908
677
7
703
94
Gap=8:462
17
509
612
170
765
275
94
503
154
512
908
677
7
703
653
Gap=4:170
17
509
612
462
765
275
94
503
154
512
908
677
7
703
653
Gap=4:170
17
509
612
462
765
275
94
503
154
512
908
677
7
703
653
Gap=4:170
17
275
612
462
765
509
94
503
154
512
908
677
7
703
653
Gap=4:170
17
275
94
462
765
509
612
503
154
512
908
677
7
703
653
Gap=4:170
17
275
94
462
765
509
612
503
154
512
908
677
7
703
653
Gap=4:170
17
275
94
462
154
509
612
503
765
512
908
677
7
703
653
Gap=4:170
17
275
94
462
154
509
612
503
765
512
908
677
7
703
653
Gap=4:170
17
275
94
462
154
509
612
503
765
512
908
677
7
703
653
Gap=4:170
17
275
94
462
154
509
612
503
765
512
908
677
7
703
653
Gap=4:170
17
275
94
462
154
509
612
503
765
512
908
677
7
703
653
Gap=4:170
17
275
94
462
154
509
612
503
765
512
908
677
7
703
653
Gap=4:170
17
275
94
462
154
509
612
503
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
509
612
503
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
509
612
503
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
509
612
503
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
509
612
503
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
509
612
503
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
509
612
503
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
765
512
653
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
653
512
765
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
653
512
765
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
653
512
765
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
653
512
765
677
7
703
908
Gap=2:170
17
275
94
462
154
503
612
509
653
512
765
677
7
703
908
Gap=1:17
170
275
94
462
154
503
612
509
653
512
765
677
7
703
908
Gap=1:17
170
275
94
462
154
503
612
509
653
512
765
677
7
703
908
Gap=1:17
94
170
275
462
154
503
612
509
653
512
765
677
7
703
908
Gap=1:17
94
170
275
462
154
503
612
509
653
512
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
612
509
653
512
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
612
509
653
512
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
612
509
653
512
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
509
612
653
512
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
509
612
653
512
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
509
512
612
653
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
509
512
612
653
765
677
7
703
908
Gap=1:17
94
154
170
275
462
503
509
512
612
653
677
765
7
703
908
Gap=1:17
94
154
170
275
462
503
509
512
612
653
677
765
7
703
908
Gap=1:17
94
154
170
275
462
503
509
512
612
653
677
703
765
7
908
Gap=1:17
94
154
170
275
462
503
509
512
612
653
677
703
765
7
908
上文是对文中所给数组排序的过程。其中,gap=***表示这一趟的取值间隔。
至于算法思想,由于篇幅关系无法在此给出,请参考
希尔排序算法
的介绍文本。
以下是我写的C程序,上面的输出系由该程序创建
//---------------------------------------------------------------------------
#include
<stdio.h>
#include
<stdlib.h>
#define
M
16
#define
FMT
"%d
"
typedef
int
data;
void
out(data
*p,int
n)
{
int
i;
for
(i
=
0;
i<n;
i++)
{
printf(FMT,p[i]);
}
putchar('\n');
}
void
shell(data
*p,int
n)
{
int
i,j,gap;
data
temp;
gap=n/2;
while
(gap>0)
{
for
(i=gap;
i<n;
i++)
{
j=i-gap;
while
(j>=0)
if
(p[j]>p[j+gap])
{
temp=p[j];
p[j]=p[j+gap];
p[j+gap]=temp;
j-=gap;
}
else
break;
printf("Gap=%d:",gap);
out(p,n);
}
putchar('\n');
gap/=2;
}
}
int
main(int
argc,
char*
argv[])
{
data
a[]={503,17,512,908,170,7,275,653,462,154,509,612,677,765,703,94};
int
i;
for
(i=0;
i<M;
i++)
printf(FMT,a[i]);
putchar('\n');
shell(a,M);
putchar('\n');
system("pause");
return
0;
}
//---------------------------------------------------------------------------

热心网友 时间:2022-05-10 18:15

楼主,你所说的一楼,我没看到啊!
你去看下我发的链接吧,那个是百度百科对希尔排序的详细解析
楼主有空去看看吧!
http://ke.baidu.com/view/178698.htm

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com