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

来源:互联网 发布:手动 备份 hdfs 数据 编辑:程序博客网 时间:2024/06/16 00:31

排序算法(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 8225 59 94 65 2345 27 73 25 3910

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

10 14 73 25 2313 27 94 33 3925 59 94 65 8245

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

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

10 14 7325 23 1327 94 3339 25 5994 65 8245

排序之后变为:

10 14 1325 23 3327 25 5939 65 7345 94 8294

最后以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/23def 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 alistif __name__ == '__main__':    li = [52,32,98,07,67]    print li    print shell_sort(li)

时间复杂度

  • 最优时间复杂度:根据步长序列的不同而不同
  • 最坏时间复杂度:O(n2)
  • 稳定想:不稳定