정렬 알고리즘 신속한 :(의 VIII) 버킷 종류

면책 조항 :이 문서는 블로거 원본입니다은 허용 블로거없이 복제 할 수 없다. https://blog.csdn.net/lin1109221208/article/details/90694110

1. 개요

배열이 정렬 버킷, 버킷하고 / 다른 정렬 알고리즘을 사용하여 반복적으로 버킷 정렬을 계속 사용하는 것이 가능하다는 것을 각각의 개별 주문 제한된 수의 할당 버킷 작동한다.

2, 알고리즘 원리

아이디어 : 각 빈 버킷 정렬 결국 모든 배럴을 병합합니다하지 않습니다를 들어, 버킷의 제한된 수에 할당 된 배열은 다음 순서를 찾아, 버킷에 하나의 항목 하나에 해당하는

     1, 내장 통

     2 서브 경통

     3 선별 통

3, 예를 들어

내지 [1,34,66,90,99,34,56,2,3,47,66,99] 정렬

1) 99 년부터 --- 배럴 가장 큰 구축, 그래서 100 비어 배럴의 설립은 0에 저장됩니다

2) 부품의 키트를 정렬 할 --- 첨자 버킷 1 + 동일한 요소로서, 값은 상기 터브 요소의 수를 나타낸다

3) 버킷 첨자 0의 값보다 큰 제거도 요구되고

(4) 알고리즘

func bucketSort(_ array : [Int], _ max : Int)->[Int]{
        var a : [Int] = [Int].init(repeating: 0, count: max)
        
        //1、创建一个空桶,全部存0
        for i in 0..<max {
            a[i] = 0
        }
        
        //2、将数组中的元素作为a的下标存储,如果有相同的,则+1
        for num in array {
            var index = NSInteger(num)
            if a[index] as! NSInteger >= 0{
                a[index] = (a[index] as! NSInteger)+1
            }else{
                a[index] = 0
            }
        }
        
        //遍历桶,根据下标取出数据并排序
        var sort = [Int]()
        for i in 0..<a.count {
            if a[i] as! NSInteger > 0 {
                if a[i] as! NSInteger > 1{
                    //处理相同数据的情况
                    for _ in 0..<a[i]{
                        sort.append(i)
                    }
                }else{
                    sort.append(i)
                }
                
            }
        }
        
        return sort
    }



调用:
        array8 = [1,34,66,90,99,34,56,2,3,47,66,99]
        array8 = bucketSort(array8, 100)


运行结果:
[1, 2, 3, 34, 34, 47, 56, 66, 66, 90, 99, 99] 

5 시간 복잡도

버킷 정렬 시간 복잡도는 O (N)

 

GitHub의 코드

참고 : 특정 구현 코드의 종류  SortSummary.swift  호출 파일 ViewController.swift에

추천

출처blog.csdn.net/lin1109221208/article/details/90694110