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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值