swift算法之排序:(八)桶排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
今日推荐