首页 > 编程语言 >s005-排序算法的稳定性及排序总结

s005-排序算法的稳定性及排序总结

时间:2022-10-30 12:00:23浏览次数:45  
标签:归并 nlogn 复杂度 稳定性 s005 快排 算法 排序

s005-排序算法的稳定性及排序总结

稳定性

如果一个数组[1,1,0,0,0,2,3,2]
最终排序后结果肯定是[0,0,0,1,1,2,2,3]
如果排在前面的0在排序后也放在前面,如果排在前面的1在排序后也放在前面...
即排序后值相等的数保持了排序前的顺序,认为该排序是稳定排序

例如学生类有班级和年龄两个字段
先将所有学生按照年龄排序,再按照班级排序
如果是稳定排序,则最后的顺序是按照班级排序,并且在班级内部学生是按照年龄排序的。
桶排序是有序的

排序总结

基于比较的排序

排序算法 时间复杂度 空间复杂度 稳定性
选择排序 $O(n^2)$ $O(1)$ no
冒泡排序 $O(n^2)$ $O(1)$ yes
插入排序 $O(n^2)$ $O(1)$ yes
归并排序 $O(nlogn)$ $O(n)$ yes
快速排序(荷兰国旗问题) $O(nlogn)$ $O(logn)$ no
堆排序 $O(nlogn)$ $O(1)$ no

用哪一个?
不考虑稳定性的情况下,优先选择快速排序,在实验证明下,快排的时间最快,因为它时间复杂度的常数项比较低
如果额外空间要求很高,使用堆排序
如果要求稳定性,使用归并排序

常见的坑

  1. 归并排序的额外空间复杂度可以变成O(1),但是非常难,不需要掌握,又想去可以搜“归并排序 内部缓存法”,但是实现后排序不再稳定
  2. “原地归并排序”的帖子都是垃圾,因为归并排序的时间复杂度变为$O(n^2)$
  3. 快排可以变成稳定的,但非常难,不需要掌握,可以搜论文“0-1 stable sort”,但是稳定后快排的空间复杂度变成$O(n)$
  4. 所有的改进都不重要,因为目前没有找到时间复杂度是$O(nlogn)$,额外空间复杂度是$O(n)$,又稳定的排序
  5. 有一道题目,是奇数放在数组左边,偶数放在数组右边,还要求原始的相对次序不变,时间复杂度$O(n)$,额外空间复杂度是$O(1)$,无解,这跟快排一样是0-1 stable sort问题,非常难

工程上对排序的改进

  1. 充分利用$O(nlogn)$和$O(n^2)$排序的各自优势,有的时候会看到在快排中当数组的长度小组60的时候,会采用插入排序,在数组长度较大的时候会采用快排。
  2. 稳定性的考虑,在Arrays.sort()的源码中可以看到,如果是基本类型,采用快排,如果是非基本类型,采用归并排序
  3. c/c++/java底层的排序代码都非常长,利用各种排序的优势做结合

标签:归并,nlogn,复杂度,稳定性,s005,快排,算法,排序
From: https://www.cnblogs.com/Oh-mydream/p/16840895.html

相关文章

  • Python 根据两个字段排序 中文排序 汉字排序 升序 降序
    Python3写法代码#-*-coding:utf-8-*-#需求:年龄倒序,姓名正序fromitertoolsimportchainfrompypinyinimportpinyin,StyleclassStudent:def__init__(self,na......
  • s004-桶排序
    s004-桶排序概念之前写的博客中讲述的排序算法,例如选择排序,冒泡排序,插入排序,快排,归并和堆排序都是基于比较的算法而桶排序不是基于比较的算法,而是基于数据状态的算法桶......
  • 决策树及其算法
    【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数据类型,选择不同的决策树算法;针对特定应用场景及......
  • 实验一:决策树算法实验
    实验一:决策树算法实验姓名:许珂学号:201613344【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数......
  • 实验二:逻辑回归算法实验
    【实验目的】1.理解逻辑回归算法原理,掌握逻辑回归算法框架;2.理解逻辑回归的sigmoid函数;3.理解逻辑回归的损失函数;4.针对特定应用场景及数据,能应用逻辑回归算法解决实际分......
  • 基于MATLAB的LTEA载波聚合算法仿真
    目录一、理论基础二、案例背景1.问题描述2.思路流程三、部分MATLAB仿真四、仿真结论分析五、参考文献一、理论基础在非连续载波聚合(高频+低频)场景下,载波衰减......
  • 基于MATLAB的指纹识别算法仿真实现
    目录一、理论基础二、核心程序三、测试结果一、理论基础在指纹图像预处理部分,论文对预处理的各个步骤包括规格化、图像分割、中值滤波、二值化、细化等以及各个步骤的......
  • 20221027数据结构与算法之线性表——顺序表
    广州疫情被封区,在家学习#pragmawarning(disable:4996)#include<stdio.h>#include<stdlib.h>//动态顺序表的实现typedefintdata_t;typedefstructSeqList{data_t*da......
  • 算法学习日记10.29
    第一章基础算法(二)高精度高精度加法大整数存储:将数字存到数组里,第一个位置存个位,第二个位置存十位......从A0+B0开始算起,算个位,满十进一易错点:将数字存在字符串里......
  • 算法题:25. K 个一组翻转链表 (困难)一次AC(题目+思路+代码+注释)
    题目K个一组翻转链表给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那......