root/python/exercise/mergesort.py

リビジョン 35, 1.3 kB (コミッタ: sgk, コミット時期: 2 年 前)

与えられた引数をいじらないように変更。

  • svn:executable 属性の設定値: *
Line 
1 #!/usr/bin/python
2 # coding:utf-8
3
4 '''マージソート
5 練習問題「マージソートを作る」。
6
7 >>> mergeSort((3, 1, 100, 5, 8, 4, 3, 9, 2, 0, 7, 10))
8 [0, 1, 2, 3, 3, 4, 5, 7, 8, 9, 10, 100]
9 >>> mergeSort(())
10 []
11 >>> mergeSort((3,))
12 [3]
13 >>> mergeSort((4,3))
14 [3, 4]
15 >>> mergeSort([7,6])
16 [6, 7]
17 '''
18
19 def mergeSort(arg):
20   '''マージソート
21   タプルまたはリストを与える。
22   リストを返す。
23   '''
24   if len(arg) < 2:
25     # 項目数が1以下なら、そのまま返す。0にはならないけど。
26     # リストじゃない場合のためにリストに変換。
27     return list(arg)
28
29   # 真ん中付近で2つに分離して、それぞれソートする。再帰呼び出し。
30   n = len(arg) / 2
31   (a, b) = (mergeSort(arg[:n]), mergeSort(arg[n:]))
32
33   # マージする。
34   # aまたはbのいずれかの項目数がゼロになるまで、
35   # 先頭の値のうち小さい方をpopして、rに付け加える。
36   r = []
37   while len(a) > 0 and len(b) > 0:
38     if a[0] < b[0]:
39       r.append(a.pop(0))
40     else:
41       r.append(b.pop(0))
42
43   # aまたはbのいずれかの項目数がゼロになったら、あとは足し合わせるだけ。
44   return r + a + b
45
46
47 # テスト用。
48 if __name__ == '__main__':
49   import doctest
50   doctest.testmod()
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。