希尔排序、快速排序、归并排序、二分查找

希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序过程

希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。

在这里插入图片描述

def shell_sort(alist):
    '''希尔排序'''
    n = len(alist)
    gap = n //2
    # gap变化到0之前,插入算法执行的次数
    while gap > 0:
        for j in range(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


if __name__ =="__main__":
    li = [54,26,63,98,77,15,55,62,20]
    print(li)
    shell_sort(li)
    print(li)

运行结果:

[54, 26, 63, 98, 77, 15, 55, 62, 20]
[15, 20, 26, 54, 55, 62
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是对折半插入排序、冒泡排序、快速排序希尔排序归并排序和堆排序的介绍: 1. 折半插入排序: 折半插入排序是插入排序的一种改进方法。它通过二分查找的方式找到插入位置,从而减少了比较的次数。具体步骤如下: - 将待排序的元素插入到已排序的序列中,使得插入后的序列仍然有序。 - 首先将第一个元素视为已排序序列,然后从第二个元素开始,依次将元素插入到已排序序列中的正确位置。 2. 冒泡排序: 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,并按照大小顺序交换它们,直到整个列表排序完成。具体步骤如下: - 从第一个元素开始,比较相邻的两个元素,如果顺序不正确,则交换它们的位置。 - 继续遍历列表,重复上述步骤,直到没有需要交换的元素。 3. 快速排序快速排序是一种高效的排序算法,它采用分治的思想,通过递归地将列表分成较小的子列表来实现排序。具体步骤如下: - 选择一个基准元素,将列表分成两个子列表,一个子列表中的元素都小于基准元素,另一个子列表中的元素都大于基准元素。 - 对两个子列表递归地应用快速排序算法,直到子列表的长度为1或0。 - 将排序后的子列表合并起来,得到最终的排序结果。 4. 希尔排序希尔排序是一种改进的插入排序算法,它通过将列表分成多个子列表来实现排序。具体步骤如下: - 选择一个增量序列,将列表分成多个子列表。 - 对每个子列表应用插入排序算法,直到整个列表排序完成。 - 不断缩小增量序列,重复上述步骤,直到增量为1。 5. 归并排序归并排序是一种稳定的排序算法,它采用分治的思想,通过递归地将列表分成较小的子列表来实现排序。具体步骤如下: - 将列表分成两个子列表,对每个子列表递归地应用归并排序算法,直到子列表的长度为1或0。 - 将排序后的子列表合并起来,得到最终的排序结果。 6. 堆排序: 堆排序是一种基于二叉堆的排序算法,它通过构建最大堆或最小堆来实现排序。具体步骤如下: - 将列表构建成一个最大堆或最小堆。 - 依次将堆顶元素与堆的最后一个元素交换,并调整堆,使得剩余元素仍然满足堆的性质。 - 重复上述步骤,直到整个列表排序完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值