希尔排序之python

希尔排序( Shell sort)

插入排序的改进版本,其核心思想是将原数据集合分割成若干个子序列,然后再对子序列分别进行直接插入排序,使子序列基本有序,最后再对全体记录进行一次直接插入排序。

1.算法描述:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

2.算法属性:

  • 不稳定
  • 希尔排序的运行时间很大程度上取决于它使用的间隙顺序
  • 对于许多实际的变量,确定它们的时间复杂度仍然是一个公开的问题
  • 大概来说它的运行时间是比O(n^2)要好点的

3.代码实现

#相比插入排序,shell排序更适合用于处理data更大的数组

def shell_sort(nums):
    start = time.time()

    gap = len(nums)       #先指定len长度给gap后续对gap进行分组子序列
    length = len(nums)

    #while用于处理每个大轮的sort
    while (gap > 0):

        #两个for循环与插入排序同理
        for i in range(gap, length):
            for j in range(i, gap - 1, -gap):
                if (nums[j - gap] > nums[j]):
                    nums[j], nums[j - gap] = nums[j - gap], nums[j]

        if (gap == 2):
            gap = 1
        else:
            gap = gap // 2    #每一次比上一次大概扩大两倍的分组子序列

    t = time.time() - start
    return nums, t           

lis = [1,2,5,8,4,3,6]
shell_sort(lis)

#输出结果
([1, 2, 3, 4, 5, 6, 8], 0.0)

原文地址:https://www.cnblogs.com/kumata/p/9119704.html

时间: 2024-10-24 12:14:11

希尔排序之python的相关文章

python实现希尔排序(已编程实现)

希尔排序: 观察一下"插入排序":其实不难发现她有个缺点: 如果当数据是"5, 4, 3, 2, 1"的时候,此时我们将"无序块"中的记录插入到"有序块"时,估计俺们要崩盘, 每次插入都要移动位置,此时插入排序的效率可想而知. shell根据这个弱点进行了算法改进,融入了一种叫做"缩小增量排序法"的思想,其实也蛮简单的,不过有点注意的就是: 增量不是乱取,而是有规律可循的. 希尔排序时效分析很难,关键码的比

排序算法分析【二】:希尔排序(附Python&C++代码)

希尔排序 也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率: 2.插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位: 算法原理 基础是插入排序,我们先看图,图片动态展示: 这个图太快了还是不知道他在干嘛,在给一张图(图片均来自互联网): 步长选择 希尔排序中步长的选择是重中之重![来自于维基百科] 1.最终步长必

Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这

python排序-希尔排序

Shell 排序利用分组加速部分有序数组排序,分组定长跳跃冒泡 希尔排序的时间性能优于直接插入排序的原因: ①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少. ②当n值较小时,n和 n^2 的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0( )差别不大. ③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的

python数据结构与算法 33 希尔排序

希尔排序 希尔排序,有时称为递减增量排序,是在插入排序基础上,把列表拆成几个较小的子表,然后对每个子表使用插入排序的方法.选出子表的方法是希尔排序的关键,它并不是把列表的中相近的元素取出来组成子表,而是使用了一个增量值I,有时也叫做"间隙",然后每隔一个间隙选中一个元素来组成子表. 这可以从图6中看出来,列表中有9个元素,如果我们使用增量3,就有3个子表,每个子表单独做插入排序.完成之后的列表如图7,现在看这个表虽然没有完全排序,但对子表排序后,元素已经很接近它们的最终位置. 图6 增

在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同. 归并排序涉及到递归的使用,需要理解其中精髓才能更好了解归并排序,以及其他应用到递归的算法.理解其本质才能更好的应用. 希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于195

希尔排序--python

1 import random 2 import time 3 4 # 插入排序 5 def insertion_sort(arr, step): 6 for i in range(step, len(arr)): 7 for j in range(i, step - 1, -step): 8 if arr[j] < arr[j-step]: 9 arr[j], arr[j-step] = arr[j-step], arr[j] 10 else: 11 break 12 13 # 希尔排序:插入

算法系列【希尔排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 1.     平方阶 (O(n2)) 排序各类简单排序:直接插入.直接选择和冒泡排序. 2.     线性对数阶 (O(nlog2n)) 排序快速排序.堆排序和归并排序: 3.     O(n1+§))排序,§ 是介于 0 和 1 之间的常数.希尔排序 4.     线性阶 (O(n)) 排序基数排序,此外还有桶.箱排序. 关于稳定性: 稳定的排序算法:冒泡排序

各种排序算法python和java实现(二)

第一篇博客实现了三种最基本最简单的排序算法,本篇文章将在这三种算法的基础上稍微演变一下. 1.快排 光从名字看就知道速度肯定不差,前一篇讲的冒泡排序,怎么看都不算是一种好的排序算法,里面充斥了太多的无谓的交换动作,时间复杂度倒是很稳定o(n^2),但对于排序算法实在说不过去.快排是冒泡排序的改进版,思路就是分治,将一个序列随机按照某个值分成两个子序列,子序列A里面的值全部比该值大,另一个子序列B的值全部比该值小,这听起来像是二叉排序树.然后依次对子序列进行如上操作,很明显快排最简单的实现就是用递