排序概述
1、排序
排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的。
2、稳定性
n 个记录的序列为{R1,R2,…,Rn},其相应的键值序列为{k1, k2,…,kn},假设ki=kj,若在排序前的序列中 Ri 在 Rj 之前,即 i<j,经过排序后,Ri 仍在 Rj 之前,则称所用的排序方法是稳定的;反之,则称所用的排序方法是不稳定的。
(若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是稳定的。)
注意: 稳定性是排序方法本身的特性,与数据无关,换句话说,一种排序方法如果是稳定的,则对所有的数据序列都是稳定的,反过来,如果在一组数据上出现不稳定的现象,则该方法是不稳定的。
3、分类
内部排序(Internal Sorting):待排序的记录全部存放在计算机内存中进行的排序过程;
外部排序(External Sorting):待排序的记录数量很大,内存不能存储全部记录, 需要对外存进行访问的排序过程。
直接插入排序
1、概念
直接插入排序(Straight Insertion Sorting)是一种简单的排序方法,它的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加 1 的有序表。直接插入排序类似图书馆中整理图书的过程。
2、算法
直接插入排序算法描述如下: ★★★ 201910 考试真题
//对顺序表 R 进行直接插入排序
void StraightlnsertSort(List R,int n)
{
int i,j;
for (i=2;i<=n;i++) //n 为表长,从第二个记录起进行插入
{
R[0]=R[i]; //第 i 个记录复制为岗哨
j=i-1;
while (R[0].key<R[j].key) //与岗哨比较,直至键值不大于岗哨键值
{
R[j+1]=R[j]; //将第 j 个记录赋值给第 j+1 个记录
j--;
}
R[j+1]=R[0]; //将第 i 个记录插入到序列中
}
}
记录 R[0] 有两个作用,其一是进入查找循环之前,它保存了 R[i] 的值,使得不致于因记录的后移而丢失 R[i] 中的内容;其二是起岗哨作用,在 while 循环中“监视”数组下标变量 j 是否越界,一旦越界(即 j<1),R[0] 自动控制 while 循环的结束,从而避免了在 while 循环中每一次都要检测 j 是否越界。
这一技巧的应用,使得测试循环条件的时间大约减少一半。
3、直接插入排序过程
4、图解动态演示
5、时间复杂度、稳定性
直接插入排序的算法简单,易于理解,容易实现,时间复杂度为 O(n2),若待排序记录的数量很大时,一般不选用直接插入排序。从空间来看,它只需要一个记录的辅助空间,即空间复杂度为 O(1)。
直接插入排序方法是稳定的。