数据结构-顺序表的插入排序

顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。

由于顺序表中可以存放不同种的数据类型,进而和结构体排序又有相似之处。其中要注意的是(->)和(.)的区别。

-> 符号是针对指针进行的操作,而 . 则是针对结构体的数据进行操作。

顺序表的初始化

cpp 复制代码
const int M = 505;

typedef struct{
    int key;            //关键元素
    int others;         //其他元素
}info;

typedef struct{
    info r[M+1];        
    int length();       //表长
}SeqList,*PSeqList;

直接插入排序

分析:

直接插入排序是最简单的排序。本质是将顺序表中的数据依次插入新的序列并使之有序的过程。

在这个过程中,数字88的和++88++ 的相对位置没有发生改变,所以这个排序是稳定的。

cpp 复制代码
void Insert_Sort(PSeqList PL)
{
    int p;
    for(int i = 2;i <= PL->length;i++)
    {
        p = PL->r[i];            //标记
        int j = i-1;
        while(PL->r[0].key < PL->r[j].key;
        {
            PL->r[j+1] = PL->r[j];
            j--;
        }
        PL->r[j+1] = p;         //插入
    }
}

复杂度:

空间复杂度

在空间上只使用了一个变量 p 进行转存操作。所以空间复杂度是

时间复杂度

最好的情况 是所有的数据已经有序,每次操作只需要把顺序表中的数据依次放入新序列即可。总的比较次数为次,总的移动次数为次。因此时间复杂度是

最坏的情况 是所有的数据逆序排列,每次操作都需要把这次操作的数据与新序列中每一个数据进行比较。第趟的比较次数为,移动次数为

总的比较次数,总的移动次数。因此时间复杂度是

一般情况下 当处理第个元素时,有个可能的插入位置。假设每个位置的可能性相同。均为,比较次数为,则平均的比较次数为。而直接插入排序的总比较次数为。一般情况下平均比较次数和平均移动次数为同一数量级,所以直接插入排序的时间复杂度为

二分插入排序

分析:

使用二分查找的思路和插入排序相结合,可以大幅度减少时间复杂度,并且是稳定的排序。

二分查找:

设顺序表中的结点按关键字递增,首先将待查值和表中间位置上的结点关键字进行比较。若二者相等,则查找成功。否则,如果,则在表的前半部分继续利用二分查找,反之,则在表的后半部分二分查找,如此进行下去直至查找结束。

二分查找的时间复杂度为

二分插入排序代码:

cpp 复制代码
void BinInsert_Sort(PSeqList PL)
{
    int l,h,mid;
    int p;
    for(int i = 2;i <= PL->length;i++)
    {
        p = PL->r[i];                    //标记
        l = 1;                           //设置区间
        h = i-1;
        while(l <= h)                    //循环查找
        {
            mid = (l+h) >> 1;
            if(PL->r[0].key >= PL->r[mid].key)
                l = mid+1;               //查找右半部分
            else    h = mid - 1;         //查找左半部分
        }
        for(int j = i-1;j >= h+1;j--)    //顺序表插入操作
            PL->r[j+1] = PL->r[j];        
        PL->r[h+1] = p;                  //插入
    }
}

复杂度:

空间复杂度

与直接插入排序相同为

时间复杂度

与直接插入排序相比,二分插入排序的比较次数与待排序的初始状态无关,只与记录的个数有关。

插入第个记录时,比较次数最多为。所以个记录排序的总比较次数为

较大时 ,显然时间复杂度比直接插入排序的最大比较次数小得多,而大于直接插入排序的最小比较数。移动次数和直接插入排序相同。所以时间复杂度为

相关推荐
福尔摩斯张27 分钟前
Axios源码深度解析:前端请求库设计精髓
c语言·开发语言·前端·数据结构·游戏·排序算法
算法与编程之美43 分钟前
提升minist的准确率并探索分类指标Precision,Recall,F1-Score和Accuracy
人工智能·算法·机器学习·分类·数据挖掘
MicroTech20251 小时前
微算法科技(NASDAQ :MLGO)混合共识算法与机器学习技术:重塑区块链安全新范式
科技·算法·区块链
李牧九丶1 小时前
从零学算法1334
前端·算法
在繁华处1 小时前
C语言经典算法:汉诺塔问题
c语言·算法
思成不止于此2 小时前
【C++ 数据结构】二叉搜索树:原理、实现与核心操作全解析
开发语言·数据结构·c++·笔记·学习·搜索二叉树·c++40周年
爪哇部落算法小助手2 小时前
每日两题day50
数据结构·c++·算法
curry____3033 小时前
基本算法(2025.11.21)
c++·算法
WWZZ20254 小时前
快速上手大模型:深度学习5(实践:过、欠拟合)
人工智能·深度学习·神经网络·算法·机器人·大模型·具身智能
司铭鸿4 小时前
图论中的协同寻径:如何找到最小带权子图实现双源共达?
linux·前端·数据结构·数据库·算法·图论