当前位置: 首页 > news >正文

[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]
 

转载于:https://www.cnblogs.com/strengthen/p/11075275.html

相关文章:

  • React 深度学习:React Core—ReactElement
  • 12、rpm
  • 分布式配置
  • 20年研发管理经验谈(十一)
  • 数据之路 - Python爬虫 - 动态页面
  • JavaScript抽象语法树英文对照
  • vue 子组件接收父组件的另一种方法
  • MySQL存储过程例子
  • sql一关联多查询时否定筛选出现的问题的解决
  • 浅复制和深复制
  • JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'
  • SpringBoot:spring boot使用Druid和监控配置
  • linux uniq去重,awk输出(可用于爆破字典优化)
  • Linux内核简介、子系统及分类
  • [转载]浅谈JavaScript函数重载
  • C++入门教程(10):for 语句
  • Computed property XXX was assigned to but it has no setter
  • HTML中设置input等文本框为不可操作
  • HTTP 简介
  • Javascript基础之Array数组API
  • Java反射-动态类加载和重新加载
  • laravel5.5 视图共享数据
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • python大佬养成计划----difflib模块
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring Boot MyBatis配置多种数据库
  • webpack入门学习手记(二)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 大数据与云计算学习:数据分析(二)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 容器服务kubernetes弹性伸缩高级用法
  • 微信小程序:实现悬浮返回和分享按钮
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​虚拟化系列介绍(十)
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #FPGA(基础知识)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (1)常见O(n^2)排序算法解析
  • (function(){})()的分步解析
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (利用IDEA+Maven)定制属于自己的jar包
  • (三)mysql_MYSQL(三)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)甲方乙方——赵民谈找工作
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net FrameWork总结
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET企业级应用架构设计系列之结尾篇