Python_希尔排序

Python 希尔排序

希尔排序也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,希尔排序的核心思想是:先将数组分割成若干个子序列,分别进行直接插入排序,然后一次缩减增量再进行排序,直至增量为零,然后对全体进行一次直接插入排序。
增量也叫分组步长,
第一次为len(array) / 2
第二次为(len(array)/2) / 2
直到增量为1
index 和 index+step所指向的值做比较,如果index指向的值比index+step指向的值大,那么就交换位置。
实现代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2018/6/4 16:31
# @Author  : li
# @File    : shell_sort.py

import random

def insertion_sort(array):

    for index in range(1, len(array)):
        # 记录当前元素值
        current_value = array[index]
        position = index
        # 只有在当前位置大于0,而且当前位置左边元素大于当前位置元素的时候
        # 才需要将当前位置左边的一个元素往右移动一位,并且当前位置往左移动一位
        while position > 0 and array[position-1] > current_value:
            array[position] = array[position-1]
            position -= 1
        # 直到直到一位元素不比current_value小,或者已经将左边所有元素比较完。
        # 记住左边永远是已经排好顺序的
        # 当将当前位置左边所有的元素都排好顺序之后,将current_value的值赋给当前位置元素
        array[position] = current_value
        print("insertion sort:", array)
    return array

# 希尔排序分组步长的取法是 len/2, (len/2)/2, ......


def shell_sort(array):

    step = int(len(array)/2)
    while step > 0:
        for index in range(0, len(array)):
            if index + step < len(array):
                current_value = array[index]
                if current_value > array[index+step]:
                    array[index], array[index + step] = array[index + step], array[index]
        print("shell sort :", array)
        step = int(step/2)
    return insertion_sort(array)

if __name__=="__main__":

    array = [random.randrange(10000+i) for i in range(10)]
    print("source array", array)
    sort = shell_sort(array)
    print "----------希尔排序-----------"
    print(sort)

输出结果为:

C:\Python27\python.exe D:/LZHROOT/MYCLASSPRO/python/test/python_algorithm/shell_sort.py
('source array', [180, 2791, 1832, 1910, 6656, 2345, 2830, 5676, 7104, 5102])
('shell sort :', [180, 2791, 1832, 1910, 5102, 2345, 2830, 5676, 7104, 6656])
('shell sort :', [180, 1910, 1832, 2345, 2830, 2791, 5102, 5676, 7104, 6656])
('shell sort :', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
('insertion sort:', [180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104])
----------希尔排序-----------
[180, 1832, 1910, 2345, 2791, 2830, 5102, 5676, 6656, 7104]

Process finished with exit code 0

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值