【数据结构】排序算法の直接插入排序

706 阅读3分钟

排序概述

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、直接插入排序过程

image.png

4、图解动态演示

排序直接插入.gif

5、时间复杂度、稳定性

直接插入排序的算法简单,易于理解,容易实现,时间复杂度为 O(n2),若待排序记录的数量很大时,一般不选用直接插入排序。从空间来看,它只需要一个记录的辅助空间,即空间复杂度为 O(1)。

直接插入排序方法是稳定的。