以前学数据结构的时候,因为老师的时间问题,导致这个算法没讲,今天有人问我这个算法问题,然后下去查了一下资料,把这个算法终于弄明白了,这个算法就是将一个数组,

先确定一个步长,一般为数组大小的一半,然后将间距每个步长对应的两个数字,从头到尾的进行比较。因为我们是从小到大,那么就是如果前面的数如果比后面的数大就将他们两进行置换,每个数都进行同一步长的比较之后,接下来就缩小步长,将现在的步长缩小为原来步长的一半,然后在重复上述步骤,将每个步长间距的数进行比较置换,直到步长为0,算法排序完毕。

下面我们看一张图,可以更加清楚的明白希尔排序的原理

希尔排序c语言版_c语言


看到这个图,我们可以清楚的看到第一趟排序的结果,和第二趟排序的结果。

现在原理都弄懂了,可是要想转化问程序,可得下一番功夫。

下面是我借鉴一个人写的c语言代码,加上我自己的理解之后,写的代码,大家可以看一下。

#include <stdio.h>
void shell_sort(int arr[],int size)
{
int step,j,front,temp;
for(step=size/2;step>0;step=step/2)
{
//从步长开始进行比较交换
for(j=step;j<size;j++)
{
temp=arr[j];
//将后一个步长后一个数的和对应进行比较如果后面的比前面的小
for(front=j-step;front>=0&&temp<arr[front];front=front-step)
{
arr[front+step]=arr[front];
}
arr[front+step]=temp;
}
}
for(step=0;step<size;step++)
{
printf("%d ",arr[step]);
}
}
void main()
{
int arr[] = {1,34,2,3,4,345,46,3,25};
shell_sort(arr,9);
}

如果看不懂的,我下面进行解释一下:首先是最外面的循环,那是确定我们的步长,直到步长为0排序就算结束。
里面第一重循环就是在把每个确定步长的间距的两个数进行比较排序,此时就是从对应的后面的那个数往前进行比较置换,在从中间往后走的过程中,里面又套了一层循环,这个就是真正的要比较置换的程序了。看着代码和图我们就会慢慢明白了。