void shell_sort(int n,int A[])//希尔排序
{
int mt=0;//移动次数movetime
int ct=0;//比较次数cmdtime
int i,j,k,h,y;
int a[N];
for(i=0;i<n;i++)
a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)
for(i=0;i<t;i++)
{ h=d[i];
for(j=h;j<n;j++)
{ y=a[j],
mt++;
for(k=j-h,ct++,mt++;k>=0&&y<a[k];k-=h)
a[k+h]=a k];
a[k+h]=y;
}
}
printf("希尔排序");
output(n,a,ct,mt);
}
void main()
{ int n;
int i;
int A[N];
printf("***********************内部排序************************\n");
printf("请输入数组大小(小于100):");
scanf("%d",&n);//输入所需排序数组大小
for(i=0;i<n;i++)
{ printf("请输入数组a[%d]:",i);
scanf("%d",&A[i]);//依次输入数组A[0]~A[n]
}
bubble_sort(n,A);//冒泡排序
insertion_sort(n,A);//插入排序
selection_sort(n,A);//选择排序
quick_sort(n,A);//快速排序
shell_sort(n,A);//希尔排序
}
【使用说明】
例如:
**********************内部排序*************************
请输入数组大小(小于100):8
请输入数组a[0]:12
请输入数组a[1]:23
请输入数组a[2]:18
请输入数组a[3]:36
请输入数组a[4]:27
请输入数组a[5]:9
请输入数组a[6]:21
请输入数组a[7]:14
冒泡排序
排序结果:9 12 14 18 21 23 27 36
比较次数:28
移动次数:45
插入排序
排序结果:9 12 14 18 21 23 27 36
比较次数:15
移动次数:29
选择排序
排序结果:9 12 14 18 21 23 27 36
比较次数:28
移动次数:21
快速排序
排序结果:9 12 14 18 21 23 27 36
比较次数:22
移动次数:16
希尔排序
排序结果:9 12 14 18 21 23 27 36
比较次数:16
移动次数:32
【调试分析说明】
这是我们学过几种内部排序方法的综合,并在之前的基础上增加计算排序方法的比较次数和移动次数,在调试过程中,相当于各种方法独立的排序,所以没有遇到太大的问题,值得注意的是对比较次数和移动次数的计算,出现过一些小麻烦,需要细心的调试。
【算法的改进设想】
这是我们学过几种内部排序方法的综合,所以在编写过程中是各自为战,没有一个整体性,另外,程序统计出比较次数和移动次数,但还没有比较明确的比较结果,这一点需要我们以后继续改进。
【总结】
在6个题目中,这个是我相对有把握的一道题目,可是在编写,调试的过程中虽然没有太大的问题,可是也没有我想象中的简单。排序方法的比较是我们之前学过几种排序方法的整合,给我最大的感受是把这些算法整合起来需要明确的思想和思路,需要整个程序的步调一致。推及到所有程序,都要我们在编程过程中注意程序的一致性。