zoukankan      html  css  js  c++  java
  • 排序算法(4)——希尔排序

    __author__ = 'steven'
    # coding=utf-8
    
    '''希尔排序
        希尔排序的实质就是分组插入排序,该方法又称*缩小增量(step)排序*,因DL.Shell于1959年提出而得名。
        希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。
        希尔排序是基于插入排序的以下两点性质而提出改进方法的:
            1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
            2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
    
        “比较”在希尔排序中是最主要的操作,而不是“交换”。用这样步长串行的希尔排序比插入排序和堆排序都要快,
        甚至在小数组中比快速排序还快,但是在涉及大量数据时希尔排序还是比快速排序慢。
    
        平均时间复杂度为:O(nlogn)
        希尔排序是非稳定排序算法。
    '''
    
    # list = [8,7,6,5,4,13,2,1]
    list = [5, 8, 1, 4, 2, 7, 3, 6]
    # list_ascended = [1, 2, 3, 4]
    # list_descended = [5, 4, 3, 2]
    
    def shell_sort(list):
        step = len(list) // 2
        while step > 0:
            # print("step=%d"%step)
            # print(list)
            for i in range(step, len(list)):
                # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置
                while i >= step and list[i - step] > list[i]:
                    list[i], list[i - step] = list[i - step], list[i]
                    i -= step    # 这里类似插入排序要逐步向前比较插入,每次跳过step的步长
                # print(list)
            step //= 2
    
        return list
    
    print(shell_sort(list))
    
    
  • 相关阅读:
    (转)解读Flash矩阵
    Size Classes with Xcode 6
    Android viewPage notifyDataSetChanged无刷新
    pgbouncer 源码编译安装
    在greenplum中创建master only 表
    创建函数查询greenplum使用到某个数据表的所有视图
    greenplum 视图权限
    创建视图查询所有segment 实例上的会话状态
    greenplumdb 元数据检查gpcheckcat 问题修复一例
    pg_dump 备份greenplum db 报错退出
  • 原文地址:https://www.cnblogs.com/stevenlk/p/6502483.html
Copyright © 2011-2022 走看看