---页首---

排序算法-计数排序

计数排序(升序为例)

思路:主要思想是统计每个整数在序列中出现的次数,进而推出每个数在序列中的位置
1. 找出序列中最大最小值,最小值 min, 最大值 max
2. 新建一个counts数组,范围是 [0, max - min], 先存储每个元素出现的次数,然后遍历该数组,使用每个位置存储的值是当前元素的个数+前面元素的总和
3. 遍历counts数组,取出元素赋值回array

class CountSort {
    
    var array = [5, 7, 2, 8, 9, 4, 7, 3, 2]
    var counts: [Int]!
    
    func sort() {
        // 遍历找出序列最大最小值
        var max = array[0]
        var min = array[0]
        for i in 1 ..< array.count {
            if max < array[i] {
                max = array[i]
            }
            
            if min > array[i] {
                min = array[i]
            }
        }
        // 统计元素出现的次数
        counts = Array<Int>(repeating: 0, count: max - min + 1)
        for i in 0 ..< array.count {
            counts[array[i] - min] += 1
        }
        // counts元素中后一个元素的值是前面元素总和+当前元素的数量
        // 这样每个索引对应的元素就是排序后的位置
        for i in 1 ..< counts.count {
            counts[i] += counts[i - 1]
        }
        // 新建数组存储排序好的数
        var results = Array<Int>(repeating: 0, count: array.count)
        for i in (0 ..< array.count).reversed() {
            // 取出array元素在counts序列中的位置
            let countIndex = array[i] - min
            counts[countIndex] -= 1
            results[counts[countIndex]] = array[i]
        }
        // 覆盖array
        for i in 0 ..< results.count {
            array[i] = results[i]
        }
    }
}

* 最好、最坏、平均时间复杂度:O(n + k),k是最大最小值范围

* 空间复杂度: O(n + k)

* 稳定性: 稳定

posted @ 2020-04-18 14:44  20190311  阅读(108)  评论(0编辑  收藏  举报
---页脚---