【数据结构】顺序表的有序插入、扩容以及排序

简介: 【数据结构】顺序表的有序插入、扩容以及排序

顺序表的有序插入

Status SeqListInsert(SqList &L,ElemType e)//有序插入的函数
{
    int i=0;
    while(i<L.length&&L.elem[i]<e)//判断插入位置合法性
    {
        i++;
    }
    ListInsert(L,i+1,e);
    //调用插入函数
    return OK;
}
Status ListInsert(SqList &L,int i,ElemType e)//插入函数
{
    int j;
    if((i<1)||(i>L.length+1)) return ERROR;
    if(L.length==MAXSIZE) return ERROR;
    for(j=L.length-1;j>=i-1;j--)
    {
        L.elem[j+1]=L.elem[j];
    }
    L.elem[i-1]=e;
    ++L.length;
    return OK;
}

相信大家对于简单的插入函数已经十分了解了,那要想实现顺序插入的话,只需要再加一个判断即可,即判断在哪插入的问题,如上。


顺序表的扩容

#define INcrease 100
void expandList(SqList& L)//扩容
{ 
    ElemType *newelem=new ElemType[INcreast];
    //INcrease为你想要扩容后表的大小
    int i = 0;
    for(i = 0; i < L.length; i++) 
    {
        newelem[i] = L.elem[i];
    }//将旧表的数据放入新表中
    delete L.elem; 
    L.elem = newelem; 
}

这里我采用的方法是重新申请一块更大的空间,并且将旧表的数据放入新表,操作为代码段中的for循环中,并且将旧表删除,为了不影响主函数中使用L.elem,我在最后将newelem重新用L.elem表示。


顺序表的排序

void Listpaixu(SqList &L)// 排序
{
    int i,j,t;
    for(i=1;i<L.length;i++)
    {
        for(j=1;j<=L.length-i;j++)//每次循环都会从第一个元素开始判断
        {
            if(L.elem[j]<L.elem[j-1])
            {
                t=L.elem[j];
                //用t来保存一下要移位的数据
                L.elem[j]=L.elem[j-1];
                //移位
                L.elem[j-1]=t;
                //把之前保存的数据放到新的位置
            }
        }
    }
}

大家在构思的时候,不妨可以在纸上简单的写一个值从大到小的顺序表

1、变换位置

为了实现这样的算法,肯定需要判断相近两个元素的值的大小关系,然后再将其变换位置,而涉及到变换位置,就需要令设一个变量用来存储移位之前的元素值,从而就可以实现元素变换位置

2、嵌套循环

通过这个嵌套循环就可以充分地将不合理位置的元素全部顺利归位,但建议大家在写算法的时候,先考虑你要实现什么样的功能,即将具体要实现的操作先写出来,再考虑需要什么样的循环条件,最后将操作放入循环即可,否则问题就会变得很复杂。


在本篇文章中我最想对和我一样的初学者分享的还是大家在写代码时,建议优先书写执行语句,即你到底想要执行什么样的操作,最后在考虑需要循环多少次的问题,这样有利于思路更加清晰,当然这仅仅是我在实践中总结的想法。

目录
相关文章
|
3月前
|
存储 编译器 C语言
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
74 2
|
11天前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
30 10
|
11天前
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
42 10
|
11天前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
31 7
|
11天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
26 5
|
25天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
2月前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
98 3
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
3月前
|
存储
数据结构(顺序表)
数据结构(顺序表)
34 0

热门文章

最新文章