Python은 버킷 정렬을 구현합니다.

Python은 버킷 정렬을 구현합니다.

1. 버킷 정렬 소개

버킷 정렬은 버킷 정렬이라고도하는 버킷 팅 및 병합으로 구현 된 정렬 알고리즘입니다.

버킷 정렬은 먼저 데이터를 제한된 수의 버킷으로 분할 한 다음 각 버킷의 데이터를 정렬하고 (버킷 내 정렬은 빠른 정렬과 같은 모든 정렬 알고리즘을 사용할 수 있음) 마지막으로 정렬 된 모든 버킷을 정렬 된 시퀀스로 병합합니다. 목록이 정렬됩니다.

버킷 정렬은 많은 추가 공간을 차지합니다. 버킷의 데이터를 정렬하려면 정렬 알고리즘을 선택하는 것이 성능에 매우 중요합니다. 버킷 정렬을 적용 할 수있는 시나리오는 많지 않으며 더 많이 사용되는 시나리오는 버킷 정렬 아이디어를 기반으로하는 카디널 정렬 및 카디널 정렬입니다.

둘째, 버킷 분류 원리

버킷 정렬 원칙은 다음과 같습니다.

1. 정렬 할 목록에서 최대 값과 최소값을 찾아 데이터 범위를 가져옵니다.

2. 데이터 범위에 따라 제한된 수의 버킷을 구성하는 데 적합한 값을 선택하고 각 버킷의 데이터 범위를 결정합니다. 데이터 범위가 [0,100)이면 데이터를 10 개의 버킷으로 나누고 첫 번째 버킷은 [0,10), 두 번째 버킷은 [10,20) 등으로 나눕니다.

3. 정렬 할 목록의 데이터를 해당 버킷에 할당합니다.

4. 각 버킷의 데이터를 정렬합니다. 여기에서는 모든 정렬 알고리즘을 사용할 수 있습니다. 시간 복잡도가 낮은 정렬 알고리즘을 사용하는 것이 좋습니다.

5. 모든 버킷의 데이터를 하나씩 꺼내 새로운 순서에 추가하면 목록 정렬이 완료됩니다.

예를 들어 오름차순으로 목록 [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 8]을 가져옵니다. 목록의 초기 상태는 아래 그림과 같습니다.

1. 정렬 할 목록에서 최대 값과 최소값을 찾아 버킷 수를 할당 할 값을 선택합니다. 예에서 최대 값은 9이고 최소값은 2이며 3 개의 버킷이 할당됩니다.

2. 정렬 할 목록을 방문하여 각 데이터를 해당 버킷에 차례로 할당합니다. 5는 두 번째 버킷의 범위에 속하며 두 번째 버킷에 배치됩니다.

3. 정렬 할 목록을 계속 방문하여 버킷을 정렬합니다. 7은 두 번째 버킷의 범위에 속하며 두 번째 버킷에 배치됩니다.

4. 정렬 할 목록을 계속 방문하여 버킷을 정렬합니다. 3은 첫 번째 버킷의 범위에 속하며 첫 번째 버킷에 배치됩니다.

5. 정렬 할 목록을 계속 방문하여 버킷을 나눕니다. 7은 두 번째 버킷의 범위에 속하며 두 번째 버킷에 배치됩니다.

6. 정렬 할 전체 목록을 항상 방문하고 모든 데이터를 해당 버킷에 넣습니다.

7. 각 버킷의 데이터에 대해 버킷 내 정렬을 수행하려면 정렬 할 목록을 오름차순으로 정렬해야하므로 각 버킷이 오름차순으로 정렬됩니다.

8. 모든 버킷의 데이터를 차례로 꺼내 정렬 된 순서에 추가합니다. 먼저 첫 번째 버킷 인 2,2,3,3의 데이터를 꺼내십시오.

9. 두 번째 버킷 인 5,5,5,7,7,7의 데이터를 계속 꺼내십시오.

10. 계속해서 버킷의 모든 데이터를 꺼내서 정렬 된 순서에 추가하면 목록이 정렬됩니다. 정렬 결과는 아래 그림과 같습니다.

셋째, Python은 버킷 정렬을 구현합니다.

# coding=utf-8
def bucket_sort(array):
    min_num, max_num = min(array), max(array)
    bucket_num = (max_num-min_num)//3 + 1
    buckets = [[] for _ in range(int(bucket_num))]
    for num in array:
        buckets[int((num-min_num)//3)].append(num)
    new_array = list()
    for i in buckets:
        for j in sorted(i):
            new_array.append(j)
    return new_array


if __name__ == '__main__':
    array = [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 8]
    print(bucket_sort(array))

작업 결과 :

[2, 2, 3, 3, 5, 5, 5, 7, 7, 7, 8, 9]

코드에서 Python 내장 함수 max () 및 min ()을 사용하여 정렬 할 목록에서 최대 값과 최소값을 찾습니다. 그런 다음 각 버킷의 데이터 범위를 3으로 설정하고 3 개의 버킷을 만든 다음 해당 버킷에 데이터를 추가합니다. 각 버킷을 꺼내서 각 버킷의 데이터를 정렬합니다. Python의 내장 함수 인 sorted ()는 코드에서 직접 사용됩니다. 빠른 정렬과 같은 정렬 알고리즘도 여기에서 사용할 수 있습니다. 버킷의 데이터가 정렬 된 후 각 버킷의 데이터가 순서가 지정된 시퀀스에 순차적으로 추가되고 목록이 정렬됩니다.

코드에서 i는 i 번째 버킷을 나타내고 j는 버킷의 데이터를 정렬 한 후 j 번째 데이터를 나타냅니다.

넷째, 버킷 분류의 시간 복잡성과 안정성

1. 시간 복잡성

버킷 정렬에서는 정렬 할 목록의 각 요소를 방문해야하며 목록 길이는 n이고 각 버킷은 버킷에서 정렬해야합니다. 단일 버킷에서 정렬 할 때 가장 복잡한 시간은 O (ni)입니다. ^ 2), ni는 i 번째 버킷에 ni 데이터가 있고 총 k 개의 버킷이 있으며 시간 복잡도는 n에 각 버킷의 정렬 시간 복잡도를 더한 값입니다. 최악의 경우 모든 데이터는 다음과 같습니다. 내부, ni = n, 시간 복잡도는 T (n) = n + n ^ 2로 나눈 다음, 버킷 팅 및 정렬을위한 단계 수를 곱합니다 (상수, big O 표기법에 영향을주지 않음). 버킷 정렬의 시간 복잡도는 O (n ^ 2)입니다.

버킷 정렬의 최적 상황은 각 버킷에 데이터를 균등하게 분배하는 것입니다. 이때 버킷은 k 개이고 각 버킷에는 n / k 개의 데이터가 있습니다. 각 버킷의 평균 정렬 시간 복잡도는 O (n / k *)입니다. logn / k), 전체 버킷 정렬의 시간 복잡도는 T (n) = n + k * n / k * logn / k이고, k = n 인 경우, 즉 각 버킷에 하나의 요소 만 있습니다 ( (버킷에서 정렬해야 함) 시간 복잡도는 O (n)입니다.

2. 안정성

버킷 정렬의 정렬 원칙에 따라 정렬 할 목록을 버킷으로 분할하고 버킷으로 정렬 한 다음 병합합니다. 버킷별로 버킷 내 정렬을 수행 할 때 다른 정렬 알고리즘을 사용할 수 있습니다. 일부 정렬 알고리즘은 안정적이며 일부 정렬 알고리즘은 불안정하여 버킷 정렬의 안정성에 영향을 미칩니다. 따라서 버킷 정렬의 안정성은 버킷 정렬 알고리즘의 안정성에 따라 달라집니다.

 

 

추천

출처blog.csdn.net/weixin_43790276/article/details/107398295