zoukankan      html  css  js  c++  java
  • python 希尔排序

    希尔排序,又称缩小增量排序,其实就是改进版的插入排序

    当待排序列基本有序的情况下,插入算法的效率非常高,那么希尔排序就是利用这个特点对插入算法进行了改造升级

    希尔排序的关键是对待排序进行分组,这个分组并不是真的对序列进行了拆分,而仅仅是虚拟的分组,增量是分组时所使用的步长

    如:

    #待排序数组
    4,1,67,34,12,35,14,8,6,19

    第一轮希尔排序

    虚拟分组,组数为(n/2),增量是(n/2),即是从第0个元素开始,每个元素和自己距离n/2(n是数组的长度)的元素分为一组

    4   35
    1   14
    67  8
    34  6
    12  19

    然后对各组内的元素进行插值排序,得到

    4, 1, 8, 6, 12, 35, 14, 67, 34, 19

    第二轮希尔排序

    上一轮排序,组数n/2,这次是(n/2)/2,增量是(n/2)/2

    4 8 12 14 34
    1 6 35 67 19
    
    分别插值排序后
    4 8 12 14 34
    1 6 19 35 67

    排序后的结果为:

    4, 1, 8, 6, 12, 19, 14, 35, 34, 67

    代码如下:

    lst = [4,1,67,34,12,35,14,8,6,19]
    length = len(lst)
    step = length//2
    
    while step > 0:
    
        for i in range(step):
            # 插入排序
            for j in range(i+step, length, step):
                if lst[j] < lst[j-step]:
                    tmp = lst[j]
                    k = j-step
    
                    while k >= 0 and lst[k] > tmp:
                        lst[k+step] = lst[k]
                        k -= step
    
                    lst[k+step] = tmp
        step //= 2 #缩小增量
    
    print lst
  • 相关阅读:
    第一课 JSON的简介
    xml 简介
    前端面试题汇总(长期更新)
    HTML5中的canvas
    AJAX第一课 AJAX的学习和简介
    margin:0 auto和text-aglin:center的区别
    js中的正则表达式
    border和box-shadow
    css中的伪类
    (素材源码)猫猫学IOS(十五)UI之曾经大热的打砖块小游戏
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/13447384.html
Copyright © 2011-2022 走看看