数据结构实验考试(希尔排序)
希尔排序具体代码:
#include<stdio.h>
int count=0;
void ShellSort(int a[],int st,int ed){
int step=ed-st+1,temp;
while(step){
step=step/3+1;
printf("第%d次的步长为: %d\n",count++, step);
for(int i=st+step;i<=ed;i++){
if(a[i-step]>a[i]){
temp=a[i];
int j=i-step;
do{
a[j+step]=a[j];
j-=step;
}while(j>=st&&a[j]>=temp);
a[j+step]=temp;
}
}
if(step==1){
break;
}
}
}
int main()
{
int a[9]={64,87,13,47,25,2,4,16,32};
int len=9,i;
printf("待排顺序为:\n\n");
for(i=0;i<len;i++){
printf("%d%c",a[i],i==len-1?'\n':' ');
}
printf("\n\n希尔排序过程中的步长:\n");
count=1;
ShellSort(a,0,9);
printf("\n\n完成希尔排序后:\n\n");
for(i=0;i<len;i++){
printf("%d%c",a[i],i==len-1?'\n':' ');
}
printf("\n\n\n");
return 0;
}
待排列的顺序为:
64 , 87 , 13 , 47 , 25 , 2 , 4 , 16 , 32
共9个元素
希尔排序的算法实现:
利用步长 跨步划分 多块区域,对每一块区域进行插入排序。
扫描二维码关注公众号,回复:
4235262 查看本文章
步长每一次变化:step=step/3+1;
Step = 向下取整( Step 除3)+ 1
当Step =1 时相当于对所有元素进行一遍 插入排序。
完成排序即可跳出。
注意:如果是相同元素(值相同),如果被划分到不同的区域可能会发生顺序的变化。
所以这个排序算法是不稳定的。
实现的复杂度目前还没有证明出来。