排序的概念与方法

摘要:
注意,排序算法的稳定性对于所有记录都是特定的,也就是说,只要在所有要排序的记录中存在不满足稳定性要求的一组关键字的实例,排序方法就不稳定。双向合并排序是最常见的合并排序方法。排序算法效率的评价指标已经在前面提到过。就排序方法的总体性能而言,很难提出一种被认为是最佳的方法。目前,有两个主要标准来评估排序算法。
排序的基本概念

1.排序

  排序(Sorting)是按关键字的非递减或非递增顺序对一组记录重新排列的操作。确切描述如下:

  假设含n个记录的序列为{R1,R2,……,Rn},其相应的关键字序列为{K1,K2,……Kn},需确定1,2,……,n的一种排列p1,p2,……pn,使其相应的关键字满足如下的非递减(或非递增)关系。K p1≤K p2≤……≤K pn即使{R1,R2,……,Rn}的序列成为一个按关键字有序的序列{R p1,R p2,……,R pn},这样的一种操作就称为排序

2.排序的稳定性 

  当排序记录中的关键字Ki(i=1,2,……,n)都不相同时,则任何一个记录的无序序列经排序后得到的结果唯一;反之,当待排序的序列中存在两个或两个以上关键字相等的记录时,则排序所得的结果不唯一。假设Ki=Kj(1≤i≤n,1≤j≤n,i≠j ),且在排序前的序列中Ri领先于Rj(即i<j)若在排序后的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的;反之,若可能使排序后的序列中Rj领先于Ri则称所用的排序方法是不稳定的。注意,排序算法的稳定性是针对所有记录而言的,也就是说,在所有的待排序记录中,只要有一组关键字的实例不满足稳定性要求,则该排序方法就是不稳定的。虽然稳定的排序方法和不稳定的排序方法排序结果不同,但不能说不稳定的排序方法就不好,各有各的适用场合

3.内部排序和外部排序

  由于待排序记录的数量不同,使得排序过程中数据所占用的存储设备会有所不同。根据在排序过程中记录所占用的存储设备,可将排序方法分为两大类,一类是内部排序,指的是待排序记录全部存放在计算机内存中进行排序的过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。

内部排序方法的分类

  内部排序方法很多,但就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的优缺点,适合在不同的环境下使用

  内部排序的过程是一个逐步扩大记录的有序序列长度的过程。在排序的过程中,可以将排序记录区分为两个区域:有序序列区和无序序列区

  使有序区中记录的数目增加一个或几个的操作称为一趟排序。

  根据逐步扩大记录有序序列长度的原则不同,可以将内部排序分为以下几类

  (1)插入类:将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度。主要包括直接插入排序。折半插入排序和希尔排序。

  (2)交换类:通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。主要包括冒泡排序和快速排序

  (3)选择类:从记录的无序子序列中“选择”关键字最小或最大的记录,并将它们加入到有序子序列中,以此方法增加记录的有序子序列的长度。主要包括加单选择排序、树形选择排序和堆排序。

  (4)归并类:通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。2-路归并排序是最为常见的归并排序方法。

  (5)分配类:是唯一一类不需要进行关键字之间比较的排序方法,排序时主要利用分配和收集两种基本操作来完成。基数排序时主要的分配类排序方法

待排序记录的存储方式

  (1)顺序表:记录之间的次序关系有其存储位置决定,实现排序需要移动记录。

  (2)链表:记录之间的次序关系由指针指示,实现排序不需要移动记录,仅需修改指针即可。这种排序方式称为链表排序。

  (3)待排序记录本存储在一组地址连续的存储单元内,同时另设一个指示各个记录存储位置的地址向量,在排序过程中不移动记录本身,而移动地址向量中这些记录的“地址”,在排序结束之后再按照地址向量中的值调整记录的存储位置。这种排序方式称为地址排序。

排序算法效率的评价指标

  前面已经说过,就排序方法的全面性能而言,很难提出一种被认为是最好的方法。目前,评价排序算法好坏的标准主要有两点。

  (1)执行时间

  对于排序操作,时间主要消耗在关键字之间的比较和记录的移动上(这里,只考虑以顺序表方式存储待排序记录),排序算法的时间复杂度由这两个指标决定。因此可以认为,高效的排序算法的比较次数和移动次数都应该尽可能的少。

  (2)辅助空间

  空间复杂度由排序算法所需的辅助空间决定。辅助空间是除了存放待排序记录占用的空间之外,执行算法所需要的其他存储空间。理想的空间复杂度为O(1),即算法执行期间所需要的辅助空间与待排序数据量无关。

免责声明:文章转载自《排序的概念与方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端构建之NPM安装mule-standalone说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考《机器学习实战》这本书...

[转]C# 获取硬盘序列号 Volume Serial Number

在做软件注册时,通常用硬盘号(建议用散列后的硬盘号)作为本地电脑特征码,加上用户名以及公司名等其他信息,通过一定的算法,得到软件序列号。这样做的好处的显而易见的。它可以防止一个序列号N多人用的现象。现在有些软件就是一个注册码,在网上公开,全世界人都在用。但是也有相应的缺陷。客户只能在一台电脑上用你写的软件。下面的方法通过Windows API获得硬盘号。...

arp报文格式解析

arp报文格式 arp报文总共42 bytes。其中以太网首部14 bytes,arp字段28字节 一、以太网首部 如下图中:目的mac地址和源mac地址各6 bytes,以太网帧类型2 bytes 二、arp字段 arp字段如下图:从上往下依次是:硬件类型、协议类型、硬件大小、协议大小、op位、发送者mac、发送者ip、目的mac、目的ip 硬件类...

8086CPU的结构与功能

CPU结构与功能 不管什么型号的CPU,其内部均有这四大部件 ALU:算术逻辑单元 工作寄存器:分为数据寄存器和地址寄存器 工作寄存器的目的是为了提高运算速度,希望参与运算的数据不从外部存储器去取数据,而是在CPU内部取,所以要有能暂存少量数据的寄存器。 数据寄存器是专门存放数据的,地址寄存器是专门存放地址,进行间接寻址方式,但当地址寄存器不提供地址时...

用户密码加密存储十问十答,一文说透密码安全存储

我们数据库的权限管理十分严格,敏感信息开发工程师都看不到,密码明文存储不行吗? 不行。存储在数据库的数据面临很多威胁,有应用程序层面、数据库层面的、操作系统层面的、机房层面的、员工层面的,想做到百分百不被黑客窃取,非常困难。 如果密码是加密之后再存储,那么即便被拖库,黑客也难以获取用户的明文密码。可以说,密码加密存储是用户账户系统的底裤,它的重要性,相当于...

Spring Boot 使用 XXL-JOB

一、配置部署调度中心 1.1 下载源码 https://github.com/xuxueli/xxl-job 1.2 数据库初始化 执行 /xxl-job/doc/db/tables_xxl_job.sql 1.3 修改配置 /xxl-job/xxl-job-admin/src/main/resources/application.properties...