Python でのクイックソート

Muhammad Waiz Khan 2023年1月30日
  1. Python でクイックソートするには numpy.sort() メソッドを使用する
  2. Pandas ライブラリの Series.sort_values() メソッドを用いた Python でのクイックソート
  3. Python でのクイックソートの実装
Python でのクイックソート

このチュートリアルでは、Python での[クイックソートアルゴリズム](/ja/tutorial/algorithm/quick-sort/の実装と適用方法を説明します。

クイックソートは分割統治のアルゴリズムです。クイックソートは配列の中からピボットとして要素を選び、ピボットより小さい要素をある配列に、ピボットより大きい要素を別の配列に配置することで、選択したピボットを中心に配列を分割します。配列に重複した要素が含まれている場合、ピボットと等しい要素は、アルゴリズムの実装に応じて、3 番目の部分配列に入れるか、2つの部分配列のいずれかに入れることができます。配列は、再帰的な呼び出しによってサブアレイをソートすることで、クイックソートによってソートされます。

クイックソートアルゴリズムは要素を比較してソートするので、比較ソートアルゴリズムに属します。

Python でクイックソートするには numpy.sort() メソッドを使用する

numpy.sort(array, axis, kind) メソッドは配列を入力として受け取り、入力配列のソートされたコピーを出力として返します。パラメータ array はソートしたい配列、axis は配列をソートしたい方向、kind はメソッドが配列をソートする際に使用するアルゴリズムを指定します。

以下のサンプルコードは、numpy.sort() メソッドを用いて、Python でクイックソートを用いて配列をソートする方法を示しています。

import numpy as np

a = np.array([2, 3, 6, 5, 7, 8, 3, 1])

sorted_a = np.sort(a, kind="quick sort")
print(sorted_a)

出力:

[1 2 3 3 5 6 7 8]

Pandas ライブラリの Series.sort_values() メソッドを用いた Python でのクイックソート

Pandas ライブラリの Series.sort_values(ascending, inplace, kind) メソッドは Pandas の Series を入力として受け取り、ソートされた系列を返します。

引数 ascending のデフォルト値は True であり、このメソッドは系列を昇順にソートします。これが False に設定されている場合、Series は降順にソートされます。引数 inplaceTrue に設定されている場合、変更は元の系列で行われ、そうでない場合はソートされたコピーが返されます。そうでなければ、ソートされた入力のコピーが返されます。kind 引数は、どのアルゴリズムメソッドが系列のソートに用いるかを決定します。

以下の例では、Series.sortvalues() がどのようにしてクイックソートアルゴリズムを用いて Python で系列をソートするかを示しています。

import pandas as pd

s = pd.Series([1, 2, 4, 2, 7, 5, 3, 2, 6, 8])

s.sort_values(inplace=True, kind="quick sort")
print(s)

出力:

0    1
1    2
3    2
7    2
6    3
2    4
5    5
8    6
4    7
9    8
dtype: int64

Python でのクイックソートの実装

3つ目の方法は、Python で独自にクイックソートアルゴリズムを実装することです。

以下のコードでは、配列を 3つのサブアレイに分割しています。1つのサブアレイにはピボットよりも小さい要素、1つのサブアレイにはピボットよりも大きい要素、3つ目のサブアレイにはピボットと等しい要素が含まれています。

メソッドを呼び出すたびに、ピボットより小さい値とピボットより大きい値を分離しているので、ソートされたピボットの位置を取得します。そして、再帰的に呼び出すことで、ソートされた完全な配列を取得します。

以下のコード例は、Python で説明したクイックソートアルゴリズムを実装する方法を示しています。

def sort(array):

    left = []
    equal = []
    right = []

    if len(array) > 1:
        pivot = array[0]
        for x in array:
            if x < pivot:
                left.append(x)
            elif x == pivot:
                equal.append(x)
            elif x > pivot:
                greater.append(x)

        return (
            sort(left) + equal + sort(greater)
        )  # recursive calling of the sort() function

    else:  # return the array, when it contains only 1 element
        return array

関連記事 - Python Sort