排序

7.排序

(1)排序的基本概念

排序Sorting)是计算机程序设计中的一个重要操作,它的功能是讲一个数据元素或记录的任意序列,重新排列成一个按关键字有序的序列。

由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是带排序记录存放在计算机随机存储器中进行排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。

通常,在排序的过程中需要进行下列两种基本操作:(1)比较两个关键字的大小;(2)将记录从一个位置移动到另一个位置。前一个操作对大多数排序方法来说都是必要的,而后一个操作可以通过改变记录的存储方式来予以避免。

待排序的记录序列有下列3种存储方式:
(1)待排序的一组记录存放在地址连续的一组数据单元上。它类似于线性表的顺序存储结构,在序列中相邻的两个记录Rj和Rj+1它们的存储位置也相邻。在这种存储方式中,记录之间的次序关系由其存储位置决定,则实现排序必须借助移动记录。

(2)一组待排序的记录存放在静态链表中,记录之间的次序关系由指针指示,则实现排序不需要移动记录,仅需修改指针即可。

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

第二种存储方式下实现的排序称为链排序,在第三种存储方式下实现的排序称为地址排序

本章讨论第一种存储方式待排序的一组记录存放在地址连续的一组数据单元上。

排序_第1张图片

(2)插入排序

直接插入排序

直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入已排好序的有序表中,从而的到一个新的、记录增1的有序表。
排序_第2张图片
排序_第3张图片

其他插入排序

折半插入排序
由于插入排序的基本操作是在一个有序表中进行查找和插入,查找操作可利用折半查找来实现,由此进行的插入排序操作称之为折半插入排序(Binary Insertion Sort)。
排序_第4张图片
2-路插入排序
2-路插入排序是在折半插入排序的基础上改进,其目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。
排序_第5张图片
表插入排序
排序_第6张图片

排序_第7张图片
排序_第8张图片
排序_第9张图片
排序_第10张图片
排序_第11张图片

(3)简单选择排序

每趟找出最小的放到最前面。
在这里插入图片描述
排序_第12张图片

(4)希尔排序

Shell’s Sort又称“缩小增量排序”(Diminishing Increment Sort),它也是一种属于插入排序类的方法,但在时间复杂度较前述几种方法有所改进。
它的基本思想是:先将整个待排记录序列分割成若干个子序列分别进行直接插入排序进行改进得到的一种插入排序方法。
排序_第13张图片
排序_第14张图片
排序_第15张图片

(5)快速排序

冒泡排序

首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换之,然后比较第二个和第三个记录的关键字。一趟排序过后的结果是使得关键字最大的记录被安置到最后一个记录的位置上。
排序_第16张图片

快速排序

快速排序Quick Sort)是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

一趟快速排序的具体做法是:附设两个指针low和high,它们的初值分别为low和high,设枢轴记录的关键字为pivotkey,则首先从high所指位置起向前搜索到第一个关键字小于pivotkey的记录和枢轴记录互相交换,重复这两步直至low=high为止。
排序_第17张图片
排序_第18张图片
排序_第19张图片
排序_第20张图片
排序_第21张图片

(6)堆排序

Heap Sort只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。
排序_第22张图片
排序_第23张图片
排序_第24张图片
排序_第25张图片
排序_第26张图片

(7)归并排序

排序_第27张图片
排序_第28张图片
排序_第29张图片
排序_第30张图片
排序_第31张图片

(8)基数排序

排序_第32张图片
链式基数排序
排序_第33张图片
在这里插入图片描述
排序_第34张图片
在这里插入图片描述
排序_第35张图片
排序_第36张图片

(9)排序算法的比较

排序_第37张图片
排序_第38张图片
在这里插入图片描述

你可能感兴趣的:(数据结构)