希尔排序

来源:互联网 发布:淘宝卖家认证复核 编辑:程序博客网 时间:2024/05/16 04:20
#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;    }





0 0