算法基础--桶排序(计数排序,基数排序)

本文只是自己的笔记,并不具备过多的指导意义。

代码的初衷是便于理解,网上大神优化过的代码很多,也不建议在项目中copy本文代码。


目录

  • 桶排序
  • 记数排序
  • 基数排序
  • 桶排序

桶排序

桶排序并不是一个具体的排序,而是一个逻辑概念。

之所以叫桶,是因为他会根据数据状况设计出一个容器,里面每个index将相当于一个桶。
在遍历数据的时候将根据划分将数据一次放入每个桶中,遍历结束后将桶依次倒出。
在每个桶内部,数据会被处理成有序结构。
具体操作可以参考记数排序。

  • 桶排序的特点
  1. 非基于比较的排序,与被排序的样本的实际数据状况很有关系。
    并不能作为一个通解被应用在普遍场景下,所以实际中并不经常使用。
  2. 时间复杂度O(N),额外空间复杂度O(N)
  3. 稳定的排序

记数排序

桶排序的具体实现,根据数据状况的最大值开辟一个容器空间

核心在于将数据值转化为键存储在额外开辟的容器空间中。
数据遍历完成,将容器空间的数据填充给原数组。

/// 计数排序
///
/// - Parameters:
///   - arr: 目标数组
///   - max: 最大值
func countingSort(arr : inout [Int] ,max:Int)  {
    var containerArr = [Int](repeating: 0, count: max+1)  //生成长度为最大值的容器数组
    var p = 0
    while p<arr.count {
        containerArr[arr[p]]+=1 //容器数组指定位置计数+1
        p+=1
    }
    p = 0
    var containerP = 0 //容器数组遍历指针
    while containerP<max { //遍历容器数组
        while containerArr[containerP]>0 { //如果容器数组指定位置大于0
            arr[p] = containerP //依次将容器数组的index填充回目标数组
            p+=1
            containerArr[containerP]-=1
        }
        containerP+=1
    }
}
算法的时间复杂度O(N),空间复杂度O(N),并且稳定

基数排序

也是桶排序的一种实现,相比记数排序堆桶的利用更加精致。

具体实现上,从个位数开始,逐位进行排序。由于每次partition都是稳定的,从而保证整体有序。
通俗点来讲,百位相同的数,按照十位排序,十位相同的数按照个位排序。

/// 基数排序
///
/// - Parameters:
///   - arr: 目标数组
///   - maxDigit: 最大位数
func radixSort(arr: inout [Int] ,maxDigit: Int) {
    var mod=10 //取余
    var containerArr = [[Int]](repeating: [Int](repeating: 0, count: 0), count: 9) //创建一个长度为9的二位容器数组
    
    while mod<=kt_pow(a: 10, b: maxDigit) {  //取余位数 小于等于 最大位数 100/10 <=10^2
        var p = 0
        while p < arr.count { //在容器数组中,将原数组以某位的值进行排列
            //获取某位的值
            let bucket = arr[p]%mod/(mod/10)  // 120%100=@20  ==> @20/(100/10) = 2
            containerArr[bucket].append(arr[p])  //加入有序数组的指定位置
            p+=1
        }
        
        p = 0
        while p < arr.count {  //将容器数组中的顺序,回倒给原数组
            for index in 0..<containerArr.count {
                while containerArr[index].count>0 { //将容器数组指定位置的元素依次出队
                    arr[p] = containerArr[index][0] //首位出队
                    containerArr[index].remove(at: 0) //移除首位
                    p+=1
                }
            }
        }
        mod*=10 //对下一位进行排序
    }
}

/// 乘方运算
///
/// - Returns: a^b
func kt_pow(a:Int ,b:Int) -> Int {
    var a=a
    let c=a
    if b == 0 {
        return 1
    }
    
    var i = 1
    while i<b {
        a=a*c
        i+=1
    }

    return a
}
算法的时间复杂度O(N),空间复杂度O(N),并且稳定

桶排序

网上有写了桶排序的,就是通过有限个数的桶,将数据源按区间放入,然后将某个桶内部排序。最后倒出。

感觉在桶内部排序的时候已经需要比较的排序方式了,违背了初衷吧。
有兴趣自己可以看一下
十大经典排序算法(动图演示)


参考资料

左神牛课网算法课
十大经典排序算法(动图演示)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279