zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。

     希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

    我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。

    #include<stdio.h>
    void sort(int *arr,int n)
    {
        int i,j,k;
        int step,tmp;
        for(step=n;step>0;step=step/2)//定步长
        {
            for(i=0;i<step;i++)//步长是几,就有几组
            {
    
                for(j=i;j<n;j+=step)//j无序数组第一个,k有序数组最后一个
                {
    
                    k=j-step;
                    tmp=arr[j];
                    while(tmp<arr[k]&&k>=i)
                    {
                        arr[k+step]=arr[k];
                        k-=step;
                    }
                    arr[k+step]=tmp;
                }
            }
        }
    
    }
    int main()
    {
        int arr[]={23,3,5,6,12,87,9,54};
        int i;
        sort(arr,sizeof(arr)/sizeof(arr[0]));
        for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
        {
             printf("%d  ",arr[i]);
        }
    
    
            return 0;
    }
    

      

  • 相关阅读:
    如何导入Support v7包?以及使用Support V7下的RecyclerView
    无言是一种教育
    自己的归宿在哪里?
    如是我愿
    【九度OJ】题目1111:单词替换
    【九度OJ】题目1054:字符串内排序
    【九度OJ】题目1061:成绩排序
    【九度OJ】题目1202:排序
    Python项目:扇贝网小组查卡助手
    Ubuntu搭建Ruby on Rails环境
  • 原文地址:https://www.cnblogs.com/curo0119/p/8586535.html
Copyright © 2011-2022 走看看