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

2017年2月14日

Python テクノロジー プログラミング 特集

Pythonコードにだいぶ慣れてきました。 Pythonistaの人たちが、「Pythonが使いやすいのはコードがシンプルになるから」とよく言っているのを聞くのだが、インクリメントがなかったり、for文が特殊だったりして、個人的には少し足りていない言語の印象がある。 悪く言うつもりはないが、クセのある言語には違いなさそうだ。

ソース

#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)

実行

$ 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使ったほうが良かったのかな???

関連記事

アルゴリズム学習

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ