首页 > 编程语言 >比较排序算法概述

比较排序算法概述

时间:2022-10-15 23:00:17浏览次数:79  
标签:结点 list mark 算法 概述 序列 排序


文章目录

排序

ref

排序的对象

  • 排序对象是:记录(也叫元素)的序列
  • 每个记录都含有若干个字段,对于排序而言,最重要的是其中的关键字字段
  • 当记录最简单化,就是数值排序(比如实数排序/整数排序)

排序分类

  • 内部排序
  • 排序元素全部载入内存进行排序
  • 外部排序
  • 被排序元素在排序过程中,需要在内,外存间移动

排序算法的稳定性SortAlgorithmStability

  • 待排序列具有前后关系,且
  • 如果排序算法排序后,仍然有前面,则该排序算法稳定

性能分析

比较排序算法的性能分析原则

  • 比较排序算法性能(时空复杂度)主要是取决于比较和移动的次数

基于比较的排序算法的比较次数

决策树(desicion tree)

  • 因为任何正确的排序算法都能够生成输入的每一个排列
  • 所以对一个正确的比较排序算法来说:
  • 个元素的种可能的排列都应该出现在决策树的叶结点上
  • 给定任意一个待排序序列,经过某一个比较排序算法处理,得到排序完的结果序列
  • 假设这个排序过程中发生的元素间调整操作的序列SOS(sort operation serials)
  • 含有n个元素的待排序序列可能有n!中序列
  • 这些序列在同一个排序算法对应不同的操作序列(操作序列的长度也可能不等长)
  • 有的序列规律性强(例如最好的情况),需要的操作步骤少,有的则相反(最坏的情况)
  • 最坏的情况对应于排序树从根结点到叶子结点的最长的一条路径(主要研究最坏的情况)
  • 不同的待排序序列对应到了不同叶结点
  • 因此叶子结点至少有n!个
  • 由这个约束,我们可以确定比较排序的决策树的高度下限
  • 而且,(每一个叶结点都必须是可以从根结点经由某条路径到达的,该路径对应于比较排序的一次实际执行过程(我们称这种叶结点为“可达的”)。
  • 因此,我们只考虑(每一种排列都是一个可达的叶结点的决策树)。

比较排序算法概述_决策树_10

  • 上述输入序列的元素序列:6,8,5
  • 根据插入排序算法构建的插入排序决策树
  • 排序目标时升序排列
  • 最坏的情况下需要从根结点比较到最长路径的叶子结点
  • 例如上例中的粗线路径(插入排序比较过程)
  • 最好的能够确定全序列有序情况是:
  • 因为,上述两个比较足以确定下来

决策树分析

  • 在最坏情况下,任何比较排序算法都需要做次比较。
  • 证明︰根据前面的讨论,对于一棵每个排列都是一个可达的叶结点的决策树来说,树的高度完全可以被确定。
  • 因为输入数据的种可能的排列都是叶结点,所以有
  • 由于在一棵高为h的二叉树中,叶结点的数目不多于,如果根结点所在高度为0,则叶结点数上限为
  • 我们得到的取值确界:
  • 对该式两边取对数,有

渐近最优的比较排序算法

  • 堆排序和归并排序都是渐近最优的比较排序算法。
  • 堆排序和归并排序的运行时间上界为O()

判断给定序列的有序性(数值序列)

  • 有序序列包括顺序和逆序
  • 一个简单的思路是,但发现任意三个元素中是无序的,则整个序列无序
  • 对于无序序列往往不需要扫描完整个序列就可以判定无序
  • 不超过n-1次
  • 对于序列,则必须至少比较n-1次才可以确定是有序的
  • 但也不超过n-1次
def judgeOrder(l, i=0, order=0,log=0):
len_l = len(l)
asc_mark = 0
dsc_mark = 0

while (i < len_l - 1):
# print(asc_mark, dsc_mark)
if l[i] <= l[i + 1]:
asc_mark += 1
else:
dsc_mark += 1
if asc_mark and dsc_mark:
if log:
print(l, "disorder!!")
return False
else:
i += 1

# if(log):
print(l, "ascend

标签:结点,list,mark,算法,概述,序列,排序
From: https://blog.51cto.com/u_15672212/5759388

相关文章

  • 原来ShardingSphere也用雪花算法
    原来ShardingSphere也用雪花算法分布式主键的生成有很多实现方式,比如百度开源的UidGenerator、美团的Leaf、以及众所周知的雪花算法,而在分库分表的场景下,id要保证唯一性,分......
  • 力扣-148-排序链表
    采用归并排序对链表进行排序可以达到O(nlogn)的时间复杂度使用自底向上的迭代写法可以将空间复杂度从O(N)降低到O(1)但是官方的写法对我来说实在是太难以理解了,尝试了......
  • 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节
    24.两两交换链表中的节点本题是一道模拟过程的题目。搞清楚两两交换的步骤之后,写出对应的代码也就不是难题了。不过在学习题解的过程中发现,两两交换的步骤也有很多种实现......
  • 快速排序
    voidquick_sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[l+r>>1];while(i<j){doi++;w......
  • 归并排序
    voidquick_sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[l+r>>1];while(i<j){doi++;w......
  • 拓扑排序
     拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中u一定在v前面,这个序列又被称为拓扑序列。 注意是将所......
  • AcWing 算法提高课 通过递推求等比数列的和(防止使用逆元出现问题)
    基于分治的思想:  例题:https://www.acwing.com/problem/content/99/模板:求num^0+num^1+...+num^kconstintMOD=9901;intQuickExp(intbase,intexp){bas......
  • C语言习题:数组与选择排序、冒泡排序
    题目1.选择法排序。输入一个正整数n(1<n≤10),再输入n个整数,将它们从大到小排序后输出。试编写相应程序。2.冒泡法排序。输入一个正整数n(1<n≤10),再输入n个整数,将它们从......
  • 【翻译】Raft 共识算法:集群成员变更
    转载请注明出处:https://www.cnblogs.com/morningli/p/16770129.html之前都在集群配置是固定的(参与共识算法的server集合)假设下讨论raft。在实践中,偶尔有需要改变配置,比如......
  • kmp算法快速简易理解
    1.求next数组1.1定义什么是最长相等前后缀长度?​ 字符串ab的最长相等前后缀为空集,长度为0​ 字符串aba的最长相等前后缀为a,长度为1​ 字符串aaa的最长相等前......