排序算法(python)-希尔排序

排序算法(python)-希尔排序

  • 插入排序是希尔排序的一种特殊情况,当希尔排序的初始步长为1时,即为插入排序。缩小增量排序 希尔排序是非稳定排序算法
  • 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

20170823150345346757212.png

20170823150345366046559.png

过程

假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序

13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10

然后我们对每列进行排序:

10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45

[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]

这时10已经移至正确位置了,然后再以3为步长进行排序:

10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45

排序之后变为:

10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94

最后以1步长进行排序(此时就是简单的插入排序了)

例子:

对于一个int数组,请编写一个希尔排序算法,对数组元素排序。

给定一个int数组A及数组的大小n,请返回排序后的数组。保证元素小于等于2000。

测试样例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]
-- coding:utf-8 --

class ShellSort:

  def shellSort(self, A, n):
      # write code here
      gap = n/2

      while gap > 0:
          for j in xrange(gap,n):
              i = j
              while i > 0: 
                  if A[i] < A[i-gap]:
                      A[i], A[i-gap] = A[i-gap], A[i]
                      i -= gap
                  else:
                      break
           gap /= 2
      return A

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by xuehz on 2017/8/23

def shell_sort(alist):

    n = len(alist)
    gap = n / 2 #python3 n // 2

    # gap 变化到0之前 插入算法执行到次数
    while gap > 0:

        #与普通的插入算法区别 gap步长 按步长进行插入排序
        for j in xrange(gap,n):

            i = j
            #插入排序
            while i > 0: # 内部循环 与前部分比较 一直到最前端
                if alist[i] < alist[i-gap]:
                    alist[i], alist[i-gap] = alist[i-gap], alist[i]
                    i -= gap
                else:
                    break
        # 缩短步长
        gap /= 2

    return alist


if __name__ == '__main__':
    li = [52,32,98,07,67]
    print li
    print shell_sort(li)

时间复杂度

  • 最优时间复杂度:根据步长序列的不同而不同
  • 最坏时间复杂度: O(n2)
  • 稳定想:不稳定
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值