当前位置: 首页 > news >正文

八大排序算法的python实现(二)希尔排序

代码:

#coding:utf-8
#author:徐卜灵

# 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
# 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
# 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
# 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
# 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
L = [1, 3, 2, 32, 5, 4]
def Shell_sort(L):
    step = len(L)/2
    while step > 0:
        for i in range(step,len(L)):            #在索引为step到len(L)上,比较L[i]和L[i-step]的大小
            while(i >= step and L[i] < L[i-step]):      #这里可以调整step从小到大或者从大到小排列
                L[i],L[i-step] = L[i-step],L[i]
                i -= step
        step /= 2
    print L
Shell_sort(L)

#别人的希尔排序代码
#引用网址:http://www.cnblogs.com/qlshine/p/6052223.html
# def shellSort(nums):
#     # 设定步长
#     step = len(nums)/2
#     while step > 0:
#         for i in range(step, len(nums)):
#             # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置
#             while i >= step and nums[i-step] > nums[i]:
#                 nums[i], nums[i-step] = nums[i-step], nums[i]
#                 i -= step
#         step = step/2
#     return nums
#
#
# if __name__ == '__main__':
#     nums = [9,3,5,8,2,7,1]
#     print shellSort(nums)

这个算法不难理解,但在写程序的时候还是遇到了小小的麻烦。主要体现在它的时间复杂读为O(n ** 1.3 )好奇怪的时间复杂度。

所以,在一次排序中,L[i]和L[i-step]的比较,一直循环到本组的第一个元素。

还需要注意一点是的索引是从step开始的。

时间复杂度最坏情况是O(n ** 2)

空间复杂度O(1)

并不是一个稳定的排序算法。

转载于:https://www.cnblogs.com/xubing-613/p/7286203.html

相关文章:

  • 海量数据处理之Bloom Filter详解
  • Bat 批处理之 for/f 详解
  • 海量数据处理面试题集锦
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • zabbix 监控 WEB 应用性能
  • 工作英文
  • 什么是RESTFUL协议?
  • distinct
  • 基础学习问题
  • 动态sql语句基本语法(字段名,表名,数据库名之类作为变量时,必须用动态SQL如ALTER TABLE中使用程序传递的参数)...
  • 从几幅架构图中偷得半点海量数据处理经验
  • 17软工 第一次作业
  • [水一下]哈,露股沟
  • APUE 1 - Unix数据结构
  • stlport 编译方法
  • SegmentFault for Android 3.0 发布
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular Elements 及其运作原理
  • Markdown 语法简单说明
  • Netty源码解析1-Buffer
  • vue中实现单选
  • 搭建gitbook 和 访问权限认证
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 前端学习笔记之观察者模式
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 思考 CSS 架构
  • 小程序开发中的那些坑
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​比特币大跌的 2 个原因
  • ​你们这样子,耽误我的工作进度怎么办?
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • *Django中的Ajax 纯js的书写样式1
  • .htaccess配置常用技巧
  • .NET Standard 的管理策略
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @Conditional注解详解
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [C#基础]说说lock到底锁谁?
  • [delphi]保证程序只运行一个实例
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [IE技巧] IE 中打开Office文件的设置
  • [IOI2007 D1T1]Miners 矿工配餐
  • [LeetCode] 19. 删除链表的倒数第 N 个结点
  • [LeetCode]—Roman to Integer 罗马数字转阿拉伯数字