開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Python (プログラミング言語)
初めてのコンピュータサイエンス(Jennifer Campbell、Paul Gries、Jason Montojo、Greg Wilson(著)長尾 高弘(翻訳))の11章(探索とソート)、11.7(練習問題)、11-6.を解いてみる。
11.7(練習問題)、11-6.
長さNのリストについて。
ソート方法 | 比較回数 | コピー回数 |
---|---|---|
選択ソート | N(N - 1) / 2 | 2N |
挿入ソート | N - 1 | 2N |
ソート方法 | 比較回数 | コピー回数 |
---|---|---|
選択ソート | N(N - 1) /2 | 2N |
挿入ソート | N(N - 1) / 2 | 2N |
ソート方法 | 比較回数 | コピー回数 |
---|---|---|
選択ソート | N(N - 1) / 2 | 2N |
挿入ソート | N(N - 1) / 2 | 2N |
N = 10の場合で確認。
コード(BBEdit)
sample.py
#!/usr/bin/env python3.3 #-*- coding: utf-8 -*- def selectionSort(l): i = 0 cmp = 0 cp = 0 while i != len(l): smallest, cmp = findMin(l, i, cmp) l[i], l[smallest] = l[smallest], l[i] cp += 2 i += 1 return (cmp, cp) def findMin(l, i, cmp): smallest = i i += 1 while i != len(l): cmp += 1 if l[i] < l[smallest]: smallest = i i += 1 return (smallest, cmp) def insertionSort(l): i = 0 cmp = 0 cp = 0 while i != len(l): cmp, cp = insert(l, i, cmp, cp) i += 1 return (cmp, cp) def insert(l, b, cmp, cp): i = b while i != 0: cmp += 1 if l[i- 1] >= l[b]: i -= 1 else: break v = l.pop(b) l.insert(i, v) cp += 2 return (cmp, cp) if __name__ == '__main__': n = 10 l = list(range(n)) for f in [selectionSort, insertionSort]: print(f.__name__) for x in [l, sorted(l, reverse=True), [0] * n]: cmp, cp = f(x) print('比較: {0:2} コピー: {1}'.format(cmp, cp))
入出力結果(Terminal)
$ ./sample.py selectionSort 比較: 45 コピー: 20 比較: 45 コピー: 20 比較: 45 コピー: 20 insertionSort 比較: 9 コピー: 20 比較: 45 コピー: 20 比較: 45 コピー: 20 $
0 コメント:
コメントを投稿