希尔排序

来源:互联网 发布:java爬虫验证码 编辑:程序博客网 时间:2024/06/07 23:21

希尔排序其实就是特殊的插入排序:先设定间距,然后根据间距将数组分解成子数组,然后子数组进行插入排序。比如:
10张牌(0-9),假设间距是3:0、3、6、9是一组;1、4、7一组;2、5、8是一组。先根据插入排序将这三组排序。
然后间距-1,则:0、2、4、6、8一组;1、3、5、7、9一组;再排序这两组。
最后间距为1,则10个到一组,最后排序。
看上去很傻,但是优势在于减少了换位置的次数,因为插入排序的优势在于对较为有序的数列排序,如果反序,当数据很大时候,每次都要比较很多次。

#include <stdio.h>void XiEr_sort(int Numbers[],int n){    int dk = 3 ;    int i,j;    for (dk = 3; dk>0; dk--)    {        //对于每个增量dk,对子数组进行直接排序        for (i=0; i+dk<n; i+=dk)         {            for (j=i+dk; j-dk>=0; j-=dk)            {                if (Numbers[j] > Numbers[j-1])                {                    break;                }                else                {                    int temp = Numbers[j];                    Numbers[j] = Numbers[j-1];                    Numbers[j-1] = temp;                }            }        }    }}int main(){    int Numbers[10] = {1,4,2,3,4,5,6,11111,2222,333};    XiEr_sort(Numbers,10);    int i;    for (i=0;i<10;i++)    {        printf("%d ",Numbers[i]);    }    printf("\n");    return 0;}
0 0
原创粉丝点击