数学建模社区-数学中国
标题:
天道酬勤系列之Python 希尔排序
[打印本页]
作者:
1047521767
时间:
2021-10-28 16:05
标题:
天道酬勤系列之Python 希尔排序
Python 希尔排序
) K8 v5 L$ _, a# _, }+ \; \
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
: k# ~2 I- {% q. o# C, l$ M
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
/ F4 \$ J1 T2 b& f: Z! v1 B) l
& b% S# s) D8 O
2 s# u& b# z- {* {( r
def shellSort(arr):
. s8 A0 n! i" k( z f4 H N& m
- w/ m" w8 k0 [: L) u0 [6 J3 l) E
n = len(arr)
/ }4 s& e+ y, J G( F5 f0 D) K
gap = int(n/2)
# N. N7 z; \ A1 C' }8 |4 i U
- K( y) _1 u8 p$ b4 P
while gap > 0:
2 [9 C" Q: E; [' Y) A
) |2 s, G' {' E0 m& U: G
for i in range(gap,n):
' C6 a& q2 k) \2 u2 q$ E+ d5 z
% c* W& [ S( P" _: Z; M# ]7 ~
temp = arr
, R9 ?( x( w! X& M9 ?# X
j = i
- |7 f% H) X% e# z( d( C& P
while j >= gap and arr[j-gap] >temp:
2 T! v9 U8 f- h* p
arr[j] = arr[j-gap]
) J0 J0 m$ \# T. ?5 y
j -= gap
* b6 X& C7 o, T% M1 E' I
arr[j] = temp
6 w! w+ } ]/ H! h* \
gap = int(gap/2)
4 h* `- k1 T% [5 }; z4 j3 d
" l2 b# Q9 w7 M% l" M! k
arr = [ 12, 34, 54, 2, 3]
' s$ g# W' ^. G7 A5 B
$ t0 X2 B4 k" }2 D1 E# R: o) J
n = len(arr)
4 _# v3 _- [/ [4 \6 A
print ("排序前:")
* k+ a$ c" W" a8 t
for i in range(n):
! R/ }4 \1 Y7 }4 {; k
print(arr
),
+ L, O$ N+ j3 x3 S
4 P! i" i7 e& Y, y% i
shellSort(arr)
5 J- O9 P' w+ q+ g( U$ s4 J2 Z
; e( [4 T! ? [
print ("\n排序后:")
) W+ Q" q1 A. ?
for i in range(n):
' N; ^+ n5 w# m$ V9 r& c
print(arr
),
* N. s+ E, ?0 l" I2 r
5 ~* l0 J# G2 W! K T+ F' x
执行以上代码输出结果为:
/ o- Z( ]: F! @# A. P7 F
排序前:12
9 q, m/ o" K3 r) ?% V, A* d
34
8 j6 U3 H, v; @# v2 {! I+ v
54
- b ]& [/ B. G+ J7 `
2
1 h P4 x5 b$ X+ R* C; a
3
, t: C! P+ z& g% S9 R5 {! I) t
. w7 B- p) C# [' u. o( f0 f) e1 x
排序后:
% o- j7 t0 ]4 c6 ]1 T% [
2
8 v* r: l( f! L: |8 R7 K2 X
3
5 P' O( P( d/ N$ K( h
12
3 [& Q/ o1 W$ |& E' J
34
& t1 A( B2 |- x! K: e
54
6 }+ J8 f) E9 r$ q
) B/ R J' n4 o- l$ w
; `( I, J- s/ b
8 }9 A9 J! _, I' i6 D4 {
8 ], x$ E1 ^ G; c& v# _
7 b$ s; E: d2 r; b1 I7 V
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5