排序算法(python)-希尔排序
来源:互联网 发布:手动 备份 hdfs 数据 编辑:程序博客网 时间:2024/06/16 00:31
排序算法(python)-希尔排序
- 插入排序是希尔排序的一种特殊情况,当希尔排序的初始步长为1时,即为插入排序。缩小增量排序 希尔排序是非稳定排序算法
- 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
过程
假设有这样一组数[ 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) - 稳定想:不稳定
阅读全文
0 0
- [Python-*-算法]希尔排序
- Python希尔排序算法
- Python排序算法-希尔排序
- 排序算法(python)-希尔排序
- 希尔排序算法 Python实现
- [排序] 希尔排序(Python)
- 排序算法--希尔排序
- 排序算法-希尔排序
- 排序算法--希尔排序
- 排序算法--希尔排序
- 排序算法---希尔排序
- 排序算法---希尔排序
- 排序算法--希尔排序
- 排序算法--希尔排序
- 排序算法:希尔排序
- 排序算法:希尔排序
- 【排序算法】希尔排序
- 排序算法---希尔排序
- 绘制流程图技巧:图文演示怎么做流程图
- 使用xUtils网络开源框架请求数据
- 线程安全的单例模式
- cocos2d-x快速加按钮
- 收藏:电商、O2O:订单系统设计
- 排序算法(python)-希尔排序
- python系列一(变量类型)
- HDU6152 Friend-Graph(拉姆齐定理)
- 单例模式的六种写法
- TX2上面opencv3.2安装遇到的两个问题及解决办法
- mitk的渲染窗口类QmitkRenderWindow分析
- ArrayList的扩容机制
- CC2538 ZigBee 芯片 两路UART串口同时使用
- go-logging的使用