zoukankan      html  css  js  c++  java
  • [Swift]计数排序 | Counting sort

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/11075275.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    1、定义:

      计数排序(Counting sort)是一种稳定的线性时间排序算法。该算法于1954年由 Harold H. Seward 提出。计数排序使用一个额外的数组,其中第i个元素是待排序数组中值等于的元素的个数。然后根据数组来将中的元素排到正确的位置。

    2、特征:

      当输入的元素是之间的整数时,它的运行时间是。计数排序不是比较排序,排序的速度快于任何比较排序算法。

      由于用来计数的数组的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用在基数排序算法中,能够更有效的排序数据范围很大的数组。

    3、算法步骤:

    (1)、找出待排序的数组中最大和最小的元素

    (2)、统计数组中每个值为的元素出现的次数,存入数组的第

    (3)、对所有的计数累加(从中的第一个元素开始,每一项和前一项相加)

    (4)、反向填充目标数组:将每个元素放在新数组的第项,每放一个元素就将减去1

    4、Talk is cheap.Show me your code.

     1 //MARK:计数排序
     2 func countingSort(_ arr:[Int]) -> [Int]
     3 {
     4     //1.找出待排序的数组中最大和最小的元素
     5     let maxNum:Int = arr.max()!
     6     let minNum:Int = arr.min()!
     7     //初始化一个与arr同样大小的数组
     8     var b:[Int] = [Int](repeating: 0, count: arr.count)
     9     //k的大小是要排序的数组中最大值和最小值之差 + 1
    10     let k:Int = maxNum - minNum + 1
    11     var c:[Int] = [Int](repeating: 0, count: k)
    12     //2.统计数组中每个值为的元素出现的次数,存入数组的第项
    13     for i in 0..<arr.count
    14     {
    15         //优化减小数组的大小,统计每个元素有几个
    16         c[arr[i] - minNum] += 1
    17     }
    18     //3.对所有的计数累加(从中的第一个元素开始,每一项和前一项相加)
    19     for i in 1..<c.count
    20     {
    21         //前缀和
    22         c[i] += c[i-1]
    23     }
    24     //4.反向填充目标数组
    25     for i in (0...arr.count - 1).reversed()
    26     {
    27         //按存取的方式取出c的元素
    28        c[arr[i] - minNum]  -= 1
    29         b[c[arr[i] - minNum]] = arr[i]
    30     }
    31     return b
    32 }

    测试:

    1 var arr:[Int] = [1,9,2,8,3,7,4,6,5,10,11,12]
    2 print(countingSort(arr))
    3 //Print [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
     
  • 相关阅读:
    为什么 PCB 生产时推荐出 Gerber 给工厂?
    Fedora Redhat Centos 有什么区别和关系?
    【KiCad】 如何给元件给元件的管脚加上划线?
    MCU ADC 进入 PD 模式后出现错误的值?
    FastAdmin 生产环境升级注意
    EMC EMI 自行评估记录
    如何让你的 KiCad 在缩放时不眩晕?
    KiCad 5.1.0 正式版终于发布
    一次单片机 SFR 页引发的“事故”
    java基础之集合
  • 原文地址:https://www.cnblogs.com/strengthen/p/11075275.html
Copyright © 2011-2022 走看看