基数ソート
基数ソート(きすうソート、英: radix sort)は、「比較によらないソート」[1]のアルゴリズムの一つで、位取り記数法で表現可能な対象について、下の桁から順番にソートしてゆき、最後に最上位桁でソートすると、全体が順序通りに並ぶ、という手法である。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
基数ソートとは、桁毎に繰り返しソートを行うことで、最終的に配列がソートされるアルゴリズムです。
ここで言う「基数」は、数学の基数 ‘Cardinal Number’ ではなく、‘Radix’ の基数です。
Nをデータの数、kを桁数として、計算量のオーダーは\(O(N \times k) \) になります。
安定ソートです。
日本語の wikipedia には、「下の桁から」とありますが、英語の wikipedia には、「右の桁から見ていく」’Least significant digit’ と「左の桁から見ていく」’Most significant digit, forward recursive’ の2つがあります。
Python で実装
3桁の整数の ‘Least signigicant digit ‘ 基数ソートを Python で記述します。
桁のソートには、計数ソートを用います。
import random def counting_sort_digit(array, digit): """ digitの位の数に基づき計数ソートを行う。 例えば、array = [17, 72, 97, 8, 32, 15, 63, 97, 57, 60] において、 counting_sort_digit(array, 1)は、 [60, 72, 32, 63, 15, 17, 97, 97, 57, 8] counting_sort_digit(array, 10)は、 [8, 17, 15, 32, 57, 63, 60, 72, 97, 97] をそれぞれ返す。 """ result_array = [0 for _ in array] counting_array = [0 for _ in range(0, 10)] for i in range(len(array)): index = array[i] // digit counting_array[index % 10] += 1 for i in range(1, 10): counting_array[i] += counting_array[i-1] for j in range(len(array)-1, -1, -1): index = array[j] // digit result_array[counting_array[index % 10]-1] = array[j] counting_array[index % 10] -= 1 return result_array def radix_sort(array, radix): max_num = max(array) digit = 1 while max_num // digit > 0: array = counting_sort_digit(array, digit) digit *= radix return array if __name__ == '__main__': random.seed(1) array = [random.randrange(1000) for i in range(20)] print('未ソート', array) # 未ソート [137, 582, 867, 821, 782, 64, 261, 120, 507, 779, 460, # 483, 667, 388, 807, 214, 96, 499, 29, 914] sorted_array = radix_sort(array, 10) print('ソート済み', sorted_array) # ソート済み [29, 64, 96, 120, 137, 214, 261, 388, 460, 483, 499, # 507, 582, 667, 779, 782, 807, 821, 867, 914]