希尔排序

希尔排序是一种基于插入排序的快速的排序算法,对于很大的数组数来说插入排序会很慢,因为它只会交换相邻的元素,因此元素只能一点点地从数组的一端移动到另一端了。例如,一个很小的数,它正好在数组尽头,要把它移到正确的位置就要n - 1次移动。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组局部进行排序,并最终用插入排序将局部有序的数组进行排序。希尔排序的思想是使数组中任意间隔h的元素有序,这样的数组称为h有序数组。换句话来说,一个h有序的数组就是由h个互相独立的数组一起组成的一个数组。如果h很大,那它将元素移动到一个很远的地方,这就是为了现实更小的h有序创造方便。用这种方式把,对于任意h为1结尾的序列,我们能将数组排序,这就是希尔排序。

希尔排序

Shell.py

#!-*-coding:utf8-*-

import operator,time,random

start = time.clock()
#将arr[]按升序排列
def Shell(arr):
    N = len(arr)
    h = 1
    temp = ""
    while(h < N // 3):
        h = h * 3 + 1  #1,4,13,40,121,364...
    while(h >= 1):
        j = h
        #将数组变为h有序
        for i in range(h,N):
            for j in range(i,N):
                if(operator.lt(arr[j],arr[j - h])):
                    temp = arr[j]
                    arr[j] = arr[j-h]
                    arr[j-h] = temp
        h = h // 3
    return arr  

#arr = [n for n in range(0,100)]
#对arr数组进行重洗
#random.shuffle(arr)

arr = ["S","H","E","L","R","A","Z","B","O"]
Shell(arr)

elapsed = (time.clock() - start)
print("Time used: %.5f" % elapsed)

>>>python Shell.py
['A', 'B', 'E', 'H', 'L', 'O', 'R', 'S', 'Z']
Time used: 0.00006

希尔排序的轨迹:

输 入 S H E L R A Z B O

4-sort
R H E L S A Z B O
R A E L S H Z B O
R A E L S H Z B O
R A E B S H Z L O
R A E B O H Z L S

1-sort
A R E B O H Z L S
A E R B O H Z L S
A B E R O H Z L S
A B E O R H Z L S
A B E H O R Z L S
A B E H O R Z L S
A B E H L O R Z S
A B E H L O R S Z

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值