zatsu na benkyou matome saito

勉強したことをまとめるだけのサイト、数学、プログラミング、機械学習とか

データ構造とアルゴリズム:comb(コムソート)

重要度低い

combというのはクシという意味なので、クシを溶かしていくように、くしの幅を小さくしていくようにソートを行う手法。 Gap 7/1.3 = 5というのは櫛の幅だと考え、1番目と5番目の数値を入れ替えて入れ替える必要がなければ戻し、Gapを狭くして同じ作業を行なっていく。Gapの7というのは配列の個数。 

スクリーンショット 2020-11-25 23.38.50.png (189.5 kB)

前回の幅である5を分子として使用して、次の櫛の幅で同じ入れ替え確認作業を行う。 スクリーンショット 2020-11-25 23.41.14.png (172.9 kB)

最終的に幅が1で入れ替え確認作業を行い、SwapフラグがFalseになったまま周回が終わるまで入れ替え作業を行なっていく。 スクリーンショット 2020-11-25 23.42.25.png (229.9 kB)

from typing import List
import random

def comb_sort(numbers: List[int]) -> List[int]:
    len_numbers = len(numbers)
    gap = len_numbers
    swapped = True

    while gap != 1 or swapped:
        gap = int(gap / 1.3)
        if gap < 1:
            gap = 1

        swapped = False

        for i in range(0, len_numbers - gap):
            if numbers[i] > numbers[i + gap]:
                numbers[i], numbers[i + gap] = numbers[i + gap], numbers[i]
                swapped = True

    return numbers

# nums = [2, 9, 1, 8, 7 ,3, 5]
nums = [random.randint(0, 1000) for i in range(10)]

print(comb_sort(nums))


[169, 197, 217, 245, 328, 383, 555, 692, 824, 983]