1.希尔排序函数
void shellSort(int arry[],int length,int step)
{/*参数一:要排序的数组
参数二:数组长度
参数三:步长*/
int i,j,k,l,temp;
for(i=0;i<length;i++)
{/*最外层循环对每个数字进行分组*/
for(j=i+step;j<length;j+=step)
{/*第二层循环,负责分好组后的插入排序*/
for(k=i;k<j;k+=step)
{/*第三层循环,找合适的插入位置*/
if(arry[j]<arry[k])
{
temp = arry[j];//将要插入的元素先保存起来
for(l=j-step;l>=k;l-=step)
{/*第四层循环,按序将整体元素向后移动一位*/
arry[l+step] = arry[l];
}
arry[k] = temp;//位置空出,将元素插入指定位置
}
}
}
}
}
2.遍历输出函数
void printArry(int arry[],int length)
{/*参数一:数组
参数二:长度*/
int i;
for(i=0;i<length;i++)
printf("%d ",arry[i]);
printf("\n");
}
3.主函数
int main()
{
int arry[10] = {49,38,65,97,76,13,27,49,55,4};
int step[3] = {5,3,1};//定义步长数组
int i;
for(i=0;i<3;i++)
{
shellSort(arry,10,step[i]);//调用希尔排序
printf("第%d轮:",i+1);
printArry(arry,10);//打印输出
}
return 0;
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
void shellSort(int arry[],int length,int step)
{/*参数一:要排序的数组
参数二:数组长度
参数三:步长*/
int i,j,k,l,temp;
for(i=0;i<length;i++)
{/*最外层循环对每个数字进行分组*/
for(j=i+step;j<length;j+=step)
{/*第二层循环,负责分好组后的插入排序*/
for(k=i;k<j;k+=step)
{/*第三层循环,找合适的插入位置*/
if(arry[j]<arry[k])
{
temp = arry[j];//将要插入的元素先保存起来
for(l=j-step;l>=k;l-=step)
{/*第四层循环,按序将整体元素向后移动一位*/
arry[l+step] = arry[l];
}
arry[k] = temp;//位置空出,将元素插入指定位置
}
}
}
}
}
void printArry(int arry[],int length)
{/*参数一:数组
参数二:长度*/
int i;
for(i=0;i<length;i++)
printf("%d ",arry[i]);
printf("\n");
}
int main()
{
int arry[10] = {49,38,65,97,76,13,27,49,55,4};
int step[3] = {5,3,1};//定义步长数组
int i;
for(i=0;i<3;i++)
{
shellSort(arry,10,step[i]);//调用希尔排序
printf("第%d轮:",i+1);
printArry(arry,10);//打印输出
}
return 0;
}
运行结果: