• 排序--希尔排序算法


    排序思路

    待排数组:arr[13]={9,3,13,1,7,5,8,6,2,12,11,10,4}   

    排后数组:newArr[13]=?

    第一轮:定义增量值d,通常首先设定d=arr.length/3+1

        d = 13/3 + 1 = 5

               从i=5+1=6的位置开始循环,依次对比 i 和 i-5 两个位置的元素大小,当arr[i]>arr[i-5]时,位置不变;当arr[i]<arr[i-5]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

        newArr={5,3,4,17,     9,8,6,212,      11,10,13}   //相同颜色为一组子序列

    第二轮:把增量值d缩小一半

        d = 5/2 + 1 = 3

               从i=3+1=4的位置开始循环,依次对比 i 和 i-3 两个位置的元素大小,当arr[i]>arr[i-3]时,位置不变;当arr[i]<arr[i-3]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

        newArr={132,   564,   879,   121110,   13}   //相同颜色为一组子序列

    第三轮:把增量值d缩小一半

        d = 3/2 + 1 = 2

               从i=2+1=3的位置开始循环,依次对比 i 和 i-2 两个位置的元素大小,当arr[i]>arr[i-2]时,位置不变;当arr[i]<arr[i-2]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

        newArr={13,   24,   65,   87,   910,   1112,   13}   //相同颜色为一组子序列

    第四轮:增量值d设置为1

               d=1

        从i=1+1=2的位置开始循环,依次对比 i 和 i-1 两个位置的元素大小,当arr[i]>arr[i-1]时,位置不变;当arr[i]<arr[i-1]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

        newArr={1,2,3,456,7,8,91011,12,13}   //相同颜色为一组子序列

               

    时间复杂度

    O(n^3/2)

    特点

    1、是直接插入排序法的改进版本,优点是保存了每一次对比的状态。

    2、把原始序列间隔增量值个位置的元素分为N个子序列,把每个子序列通过插入法整理成基本有序序列。

         然后不断缩小增量值,不断整理成N个基本有序序列。

         直到增量值等于1,基本有序序列就成为绝对有序序列。

  • 相关阅读:
    STDMETHOD_,STDMETHOD,__declspec(novtable)和__declspec(selectany)
    __stdcall 与 __cdecl
    winows 进程通信的实例详解
    Windows 下多线程编程技术
    MFC/VC++ UI界面美化技术
    VC++中 wstring和string的互相转换实现
    VS2010项目转化为VS2008项目
    VC++ 响应回车键的2种方法
    高效 告别996,开启java高效编程之门 2-4实战:单一条件参数化
    高效 告别996,开启java高效编程之门 2-3实战:硬编码业务逻辑
  • 原文地址:https://www.cnblogs.com/kavilee/p/5900031.html
Copyright © 2020-2023  润新知