各大“排序”特性及稳定性总结

简介: 各大“排序”特性及稳定性总结

一、各个排序特性




二、各个排序的稳定性分析及例子


       稳定性如何定义:排序算法的稳定性并不是指它在对数组进行排序的时候的时间复杂度是否变化,而是对于相同数值的数据进行排序了之后它们的相对位置是否发生了变化,比如说在考试的时候,小明先交卷,小强后交卷,但是他们改出来的成绩是相同的,因为小明先交卷,改出来的成绩数据肯定放在前面,小强后交卷,改出来的成绩数据肯定放在后面,所以排完序之后要求小明的成绩依然在前面,这叫做排序算法的稳定性。如果排完序之后小明的数据跑到了后面去,那对小明来说肯定是不公平的,所以在这种情况下在进行排序的时候就需要选择稳定的排序算法了。


冒泡排序:稳定,因为冒泡排序是两两比较,再进行交换的,如果两个数据相等的时候不进行交换就能做到相同数据始终保持着原来的相对大小关系了。


选择排序:不稳定,很多人误以为这个选择排序是稳定的,包括有些书本也说选择排序是稳定的排序,他们想着选择排序就是每次找到一个最小值放到最左边,如果有多个最小值就拿靠前的那个就能做到不改变相同数据的相对位置了,我一开始也是这样子想的,但是再仔细想一下你会发现,如果最左边的值也存在重复的值,而且找到的最小值又是在这个重复的值的右边呢?那在你把找到的最小值交换到最左边的时候就会改变了另一个重复数字之间的相对位置了。所以选择排序是不稳定的。这里是一个易错点。演示看下图:



直接插入排序:稳定,因为直接插入排序是从后往前找比自己小的数,再插入到这个数的后面的,只要在找到和自己相等的数的时候,插入到这个数的后面,就能够保证相等的数的相对位置在排序前后是保持不变的。


希尔排序:不稳定,因为希尔排序是通过分组预排序实现的,当相同的数分到不同的组,在预排序的时候有可能改变它们的相对位置。如下:



堆排序:不稳定,在排序过程中,向下调整会使相同的数的相对位置发生变换。如下:(4条消息) “堆”排序_KOBE 0824 BRYANT的博客-CSDN博客



归并排序:稳定, 在归并的时候只要保证左边的先归并,右边的后归并就能保证相同数据的相对位置不发生变化,归并排序也是几个时间复杂度为O(N*logN)量级中唯一一个稳定的排序。但是需要O(N)的空间复杂度。


快速排序:不稳定,无论是快排的哪一种版本的写法(hoare法,挖坑法,前后指针法,三路划分法),都不能保证相同数据在排完序之后的相对位置不发生变化。因为当两个相等的数都比key大的时候,前一个数肯定会交换到右边更靠后的位置,后一个数肯定会交换到右边更靠前的位置,此时相对位置一定发生了变化,所以快速排序时不稳定的,如下图:



以上就是关于排序算法稳定性分析及各排序各方面特性的总结,你学会了吗?

相关文章
|
7月前
|
存储 算法 Android开发
提升安卓应用性能的五大实用策略
【4月更文挑战第5天】在快速发展的数字时代,用户对移动应用的性能要求越来越高。对于安卓开发者而言,优化应用性能不仅是提升用户体验的关键,也是增强应用竞争力的必要手段。本文将深入探讨五种实用的策略,帮助开发者有效提升安卓应用的性能。这些策略涵盖了从代码优化到资源管理等多个方面,旨在为开发者提供全面的指导和建议。通过实践这些策略,开发者可以显著减少应用的内存消耗、提高响应速度,并最终交付给用户一个更加流畅和高效的应用体验。
|
1月前
|
数据库 数据库管理 索引
索引在提高查询性能方面的优势体现在哪些方面?
索引在提高查询性能方面具有多方面的显著优势
|
26天前
|
SQL 缓存 监控
接口性能倍增记:一次成功的优化实践
在软件开发过程中,接口性能优化是提升用户体验和系统稳定性的关键环节。本文将分享一次接口优化的成功案例,从问题发现到解决方案实施,详细介绍我们的优化过程和成果。
26 0
|
26天前
|
缓存 监控 数据库
接口性能飞跃:一次成功的优化实践
在软件开发中,接口性能优化是一个永恒的话题。一个高效的接口不仅能提升用户体验,还能减轻服务器压力,降低运营成本。本文将分享一次成功的接口优化案例,从问题诊断到解决方案实施,详细介绍我们的优化过程。
36 0
|
7月前
|
缓存 监控 Android开发
提升安卓应用性能的五大关键策略
【4月更文挑战第30天】 在竞争激烈的应用市场中,卓越的性能是确保用户留存和应用成功的核心因素。本文将详细阐述五种提高安卓应用性能的有效技术策略。这些策略包括优化内存使用、减少网络请求延迟、多线程与并发处理、UI渲染优化以及电池效率改进。通过深入分析每项技术的原理及其在实际开发中的应用,旨在帮助开发者构建更快速、流畅且响应敏捷的安卓应用。
|
7月前
|
消息中间件 Prometheus 监控
哪种架构更符合未来云的发展趋势呢?
我们的在线教育平台因单体架构面临部署复杂、扩展性和协作效率难题。为解决这些问题,我们转向微服务架构,将应用拆分成独立服务,采用Docker和Kubernetes实现容器化部署,通过CI/CD提升部署效率。同时,使用RESTful API和消息队列处理服务间通信,借助Prometheus和ELK Stack保证监控与日志管理。尽管遇到服务依赖管理和技术栈选择等挑战,但微服务已显著提升系统扩展性和团队效率。未来,我们将继续优化微服务架构,关注新技术如服务网格和无服务器架构,以提升系统性能和用户体验。
53 1
|
7月前
|
算法 开发工具 Android开发
提升安卓应用性能的五大策略
【2月更文挑战第16天】在竞争激烈的应用市场中,性能优越的安卓应用更能吸引和保留用户。本文将深入探讨五种有效的策略,帮助开发者优化安卓应用性能,包括代码优化、内存管理、多线程应用、使用最新的安卓SDK以及利用硬件加速特性。
|
7月前
|
搜索推荐 UED
产品服务的用户体验特性
产品服务的用户体验特性
102 5
|
7月前
|
安全 关系型数据库 MySQL
面对多种国产数据库,如何选择合适的技术栈和发展方向
面对多种国产数据库,如何选择合适的技术栈和发展方向
188 0
|
存储 消息中间件 数据库
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
下一篇
DataWorks