[アルゴリズム] クイックソートの実装(Python編)

Pythonコードにだいぶ慣れてきました。
Pythonistaの人たちが、「Pythonが使いやすいのはコードがシンプルになるから」とよく言っているのを聞くのだが、インクリメントがなかったり、for文が特殊だったりして、個人的には少し足りていない言語の印象がある。
悪く言うつもりはないが、クセのある言語には違いなさそうだ。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#coding: UTF-8 def mid(x,y,z): if x < y: if y < z: return y elif z < x: return x else: return z else: if z < y: return y elif x < z: return x else: return z def quickSort(numbers , begin , end): if end >= 0 and begin >= 0 and end - begin <= 1: return numbers begin = 0 if begin < 0 else begin end = len(numbers)-1 if end <0 else end left = begin right = end if begin >= end: return numbers pivot = mid(numbers[left] , numbers[left + int((right - left)/2)] , numbers[right]) while 1: while numbers[left] < pivot: left += 1 while numbers[right] > pivot: right -= 1 if left >= right: break tmp = numbers[left] numbers[left] = numbers[right] numbers[right] = tmp left += 1 right -= 1 numbers = quickSort(numbers , begin , left) numbers = quickSort(numbers , right , end) return numbers print quickSort([10,2,12,7,16,8,13] , -1 , -1) |
実行
1 2 |
$ python quickSort.py [2, 7, 8, 10, 12, 13, 16] |
解説
インクリメントが使えない
プログラムの醍醐味であるインクリメントが無いなんてコーダーとしては何だか物足りないんじゃないか?と思うが、下記のように対応することでいいらしい。
num++
↓
num += 1
三項演算子の書き方
JSやPHPの三項演算子は
$hoge = (fuga < 0) ? 0 : fuga;
というところを、Pythonでは、以下のように記述する
# 変数 = (if==trueの返り値) if (条件) else (if==falseの返り値)
hoge = 0 if fuga < 0 else fuga
返り値が最初に来るところが、悩ましいですね。
nullを使わずに-1を使用
Pythonだからというわけではないが、JS以外は変数の型には忠実に従ったほうがいいので、quickSort関数の第2,3引数にnullを使わずに、マイナス値を使いましたが、これで、配列内の数値はプラスの数値しか使えなくなってしまいました。
null使ったほうが良かったのかな???