希尔排序

#include<stdio.h>//在没看懂希尔排序之前我觉得这是什么代码啊,真心难懂,后来看懂过程后,发现就是简单直接插入排序的优化(看懂随手编~~)
 int main()
 {
     int a[100];
     int i,j,k,n,gap,temp;
     printf("请输入数组长度\n");
     scanf("%d",&n);
     printf("请输入数组元素\n");
     for (i=0;i<n;i++)
     scanf("%d",&a[i]);//因为希尔排序是跳跃性的排序,所以需要先保存下每个元素(而不能像之前插入排序边读入边插入)
     for (gap=n/2;gap>0;gap=gap/2)
     {
       for (i=0;i<gap;i++)//(这里要理解)因为每个待排序的小组有gap个,这意味着什么,每个小数组的开头分别是0~gap-1(而不是简单直接插入排序的0)
       {
        for (j=i+gap;j<n;j=j+gap)//每个小数组的下一个元素怎么找,就是+gap,(其实就是将+1换成了+gap),同样注意每个小数组第一个数已经有序(所以从数组第二个开始)
       {
          temp=a[j];
        for (k=j-gap;k>=0&&a[k]>temp;k=k-gap)//每个小数组进行简单插入排序
        a[k+gap]=a[k];
        a[k+gap]=temp;
        }//我们想象一下这段程序是干嘛的,先是确定每个小数组开头,然后每个小组进行简单插入排序,接下来再换一个小组开头
        }//而所有这一切又是属于同一个gap的,这样括号的位置也容易理解了~~
     }
     for (i=0;i<n;i++)
     printf("%d ",a[i]);
     return 0;
    }





你可能感兴趣的:(希尔排序)