zoukankan      html  css  js  c++  java
  • 排序算法----希尔排序

    希尔排序

      希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。  

      

      

     1 """
     2 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
     3 """
     4 
     5 
     6 # 方式一:元素采取直接插入排序从前往后比较
     7 def shell_sort(int_list):
     8     length = len(int_list)
     9     if length <= 1: return int_list
    10     step = length // 2
    11 
    12     while step > 0:
    13         for i in range(step, length, step):
    14             item = int_list[i]
    15             for j in range(0, i, step):
    16                 if int_list[j] > item:
    17                     for k in range(i, j, -step):
    18                         int_list[k] = int_list[k - step]
    19                     int_list[j] = item
    20                     break
    21         step //= 2
    22     return int_list
    23 
    24 
    25 # 方式二:元素采取直接插入排序从后往前比较
    26 # 继续缩小增量
    27 def shell_sort1(alist):
    28     gap = len(alist) // 2
    29     while gap >= 1:
    30         # 将增量设置成gap
    31         for i in range(gap, len(alist)):
    32             while i > 0:
    33                 if alist[i] < alist[i - gap]:
    34                     alist[i], alist[i - gap] = alist[i - gap], alist[i]
    35                     i -= gap
    36                 else:
    37                     break
    38         gap //= 2
    39     return alist
    40 
    41 
    42 # print(shell_sort([11, 3, 5, 89, 1,23456,87678,2345,4567,0,3,5]))
    43 if __name__ == '__main__':
    44     int_str = input("请输入逗号分割的整数>>>").strip()
    45     int_list = [int(i) for i in int_str.split(",")]
    46     print(shell_sort(int_list))
    47     # print(shell_sort1(int_list))
  • 相关阅读:
    驱动开发之基本
    Bitmap文件格式+生成一个BMP文件
    PPP 转义字符 编码 和 解码
    数组数据整体按位左移或右移一位
    一个assert的写法
    c++11 右值引用 && std::move()
    openMP一小时初探
    linux命令学习_实验楼(一)
    50 行 Python 代码完成图片转字符
    LFW精确度验证__c++双线程读写txt
  • 原文地址:https://www.cnblogs.com/open-yang/p/11367089.html
Copyright © 2011-2022 走看看