• 0.排序介绍与性能度量


    1. 什么是排序

      排序就是将一组“无序”的记录序列调整为“有序”的记录序列。其定义如下:

      假设含有n个记录的序列为{r1, r2, …, rn},其相应的关键字分别为{k1, k2, …, kn},需确定1, 2, …, n的一种排p1, p2, …, pn,使其相应的关键字满足kp1 ≤ kp2 ≤ … ≤ kpn非递减(或非递增)关系,即使得序列成为一个按关键字有序的序列{rp1, rp2, …, rpn},这样的操作就称为排序。

     

      显然输入的是一个记录集合,输出也是一个记录集合,所以可以将排序视为线性表的一种操作。

     

    2. 单关键字排序与多关键字排序

      上述定义中关键字 ki 可以是记录 r 的主关键字,也可以是次关键字,甚至是若干数据项的组合。比如要对学生的总成绩排名,在总分相同的情况下,将语数外总分做降序排名。其中总成绩为主关键字,语数外总分为次关键字。一般对于多关键字排序,先按照主关键字排序,再按照次关键字排序,但效率太慢。我们可以直接将语数外的总分加在总成绩后面,合成新的关键字,利用这个新关键字排序,如总成绩758,语数英总分230,新关键字为“758230”。

      多个关键字的排序最终都可以转化为单个关键字的排序,所以主要讨论单关键字排序。

     

    3. 排序的稳定性

      稳定的排序算法是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变

      即,假设 ki = kj (1 ≤ i ≤ n, 1 ≤ j ≤ n, i≠j ),且在排序前的序列中 r在 r之前( i < j)。如果排序后 r依然在 r前面,则称该排序方法是稳定的;反之,如果排序后 r在 r之前,称该排序方法为不稳定的。

     

    4. 内部排序和外部排序

      根据排序过程中待排序记录是否全部在内存中,排序分为:内部排序和外部排序。

      内部排序在排序整个过程中,待排序记录全部在内存中,不需要访问外存;而外部排序由于待排序的记录量很大,全部待排序记录不能同时放在内存中,需要在内外存之间多次交换数据才能进行。我们主要分析内部排序。

     

    5. 排序算法性能度量

    5.1 时间性能

      在内部排序中,主要进行两种操作:比较和移动。比较是两个关键字的比较,以此确定记录的先后位置。移动是记录的移动。高效的排序算法应该尽可能少的比较关键字和移动记录

     

    5.2 辅助空间

      辅助存储空间是除了存放待排序记录所占用的存储空间之外,执行算法所需要的其他存储空间。

     

    5.3 算法的复杂性

      这里指算法本身的复杂度,不是算法的时间复杂度。

      根据排序过程中借助的主要操作,将内部排序分为:插入类、交换类、选择类归并类。按照复杂度将后学的排序算法分为两大类:冒泡排序、简单选择排序和直接插入排序属于简单算法,希尔排序、堆排序、归并排序、快速排序属于改进算法。

     

    6. 学习排序算法的目的

      这些排序算法都是比较成熟的,已经广泛地应用于许多的程序语言和数据库中,都已经封装了关于排序算法的代码。所以,我们学习这些排序算法的目的不是在现实中实现它们,而是通过学习来提高我们编写算法的能力,以便于解决更多复杂度和灵活的应用问题。

     

    参考:《大话数据结构》

  • 相关阅读:
    qml+opencv(二),实现人脸检测
    CPU满格的元凶,这回是由于QTimer引起的(默认interval是0,太猛)
    Qt文档系统分析(解释Qt文档的生成工具与过程)
    2015 最受开发者欢迎的开发工具和服务(摘录对自己有用的)
    RAD Studio 10 自带Demo代码汇总说明
    ACE 容器之三 ACE_Unbounded_Queue的使用
    开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)
    我是觉得创业永远不晚 但是绝对要谨慎,不是破釜沉舟就一定能赢的(不用拿工资啊 吃喝拉撒在公司报账就好了)
    人生的成功与否,真的是以天来计算啊——时间永远都是最宝贵的!
    thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)
  • 原文地址:https://www.cnblogs.com/datamining-bio/p/9715616.html
Copyright © 2020-2023  润新知