版权声明:本文为博主原创文章,未经博主允许不得转载。 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)
注:排序的具体实现代码在 SortSummary.swift 文件里 调用是在 ViewController.swift