希尔排序

希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量(gap)的排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是不稳定的算法

希尔排序没有 快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的 数据排序不是最优选择。

希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的 排序算法

 

增量:

好的 增量序列的共同特征:    最后一个 增量必须为1;

举例:n=10

49, 38, 65, 97, 26, 13, 27, 49, 55, 4

gap = n;

gap = gap/2;

49-13  38-27  65-49  97-55  26-4

排序后:13  27  49  55  4  49  38  65  97  26

gap = gap/2;

13-49  27-55  49-4  55-49  4-38  49-65  38-97  65-26

排序后:4   26   13   27   38    49   49   55   97   65

gap = gap/2;

排序后:4   13   26   27   38    49   49   55   65   97

 

代码:(从小到大)

#include <stdio.h>
//3 7 6 5 1 0
//3 5
//7 1
//6 0

//7 6 5 3 1 0
void aaa(int a[],int n)
{
    int gap = n,flag = 0;
    int i,j,t;
    while(gap > 1)
    {
        gap /= 2;
        do
        {
            flag = 0;
            for(i=0;i<n-gap;i++)
            {
                j = gap+i;
                if(a[j]<a[i])
                {
                    t = a[j];
                    a[j] = a[i];
                    a[i] = t;
                    flag = 1;
                }
            }
        }while(flag != 0);
    }


}
int main()
{
    int i,j,t;
    int a[12]={0};
    for(i=0;i<6;i++)
    {
        scanf("%d",&a[i]);
    }
    aaa(a,6);
    for(i=0;i<6;i++)
    {
        printf("%d ",a[i]);
    }

    return 0;
}

 

posted @ 2016-11-02 17:29  961897  阅读(171)  评论(0编辑  收藏  举报