zoukankan      html  css  js  c++  java
  • 插入排序-shell排序

    shell排序

    这个系列是回顾之前所学,是用python商量着完成的。

    路过的大佬就当看个乐,实现算法的方式不一,也有讨巧的做法。

    我只讲讲我的思路,希望大家浏览的时候能多多提建议,共同学习共同进步。

    --------------------------------------------------------------------------------------------------------

    shell排序基本思想:
    shell是插入排序的一种高效改进版本,shell排序是不稳定排序算法,该算法由shell在1959年提出而命名,属于比较早的算法之一。


    shell排序是把记录按下标的一定增量分组,将其称之为gap,对每组使用直接插入排序算法
    每一次分组排序完成,gap都会除以2并向下取整,对更细分的分组进行直接插入排序
    直至gap为1,整个文件恰被分成一组,算法便终止。

    但就我所理解的,当每次分组完成,比较的永远是每个分组对应下标的值

    比如: [2, 4,  5, 1,   3]

    其中2、5、3的下标都为0,gap为2,比较的时候就比较它们三个的值,根据降序交换位置

    随着gap的减小,整个序列的排序愈发明显

    为1时,刚好排完

    以下是具体实现:

    def shell_sort(list):
        gap = len(list) // 2
        # 1.首先确定一下,第一次gap的值
        # 6.gap是要大于等于1的,一般到1就基本ok了
        while gap >= 1:
            for i in range(gap, len(list)):
                # 2.这里为什么要设置成len(list),这是防止出现序列是奇数的情况,如果这里是gap的倍数那么会落下最后一个值取不到的情况
                # 3.这里为啥要从gap开始取值,因为我们是要比较不同组同下标的值嘛
                # 5.所以这里是不是还要有一个循环呀? i不能等于0,避免out of range
                while i > 0:
                    if list[i] < list[i-gap]:
                        # 4.比较大小,这里没什么好讲的
                        list[i], list[i-gap] = list[i-gap], list[i]
                    else:
                        break
                        # 5.这里会存在一个问题,就是如何确保比较的值一定比前面的值大还是小?
                        # 5.所以我们还是需要拿当前的值去比较前面的值大小,这里就需要迭代一下
                        i -= gap
            # 6.那每一次的分组排序完成,我们就需要改变gap值的大小
            gap //= 2
        return list

     以上,接下来实现一下直接插入排序

  • 相关阅读:
    CentOS7使用集群同步脚本对文件同步分发
    CentOS7安装jdk1.8
    CentOS7+CDH5.12.1集群搭建
    nginx通配符
    Nginx反向代理及配置
    一些好玩有用的书签
    linux操作小技巧锦集
    系统压测结果对比:tomcat/thinkphp/swoole/php-fpm/apache
    python修改linux日志(logtamper.py)
    【原创】给定随机数的取值范围(最小值、最大值),且要求多次取得的随机数最后的结果有一个固定的平均值
  • 原文地址:https://www.cnblogs.com/PurpleRain98/p/13588492.html
Copyright © 2011-2022 走看看