当前位置: 首页 > news >正文

数据结构实验1.3: 有序顺序表的归并

文章目录

  • 一,问题描述
  • 二,基本要求
  • 三,算法分析
  • 四,示例代码
  • 五,运行效果


一,问题描述

编程实现将两个顺序存储的有序线性表归并为一个线性表,归并后的线性表仍然有序,要求同样的数据元素只出现一次。

二,基本要求

  1. 设计创建有序顺序表的算法(可采用有序直接插入法);
  2. 设计有序顺序表的归并算法;
  3. 设计输出顺序表全部元素的算法;
  4. 编写求解归并问题的完整程序,设计好测试用例;
  5. 上机调试、测试,记录测试结果,对测试结果进行分析。

三,算法分析

由于两个线性表中的元素呈有序排列,在进行合并的时候,依次比较,哪个线性表的元素值小,就先将这个元素复制到新的线性表中,若两个元素相等,则复制一个即可,这样一直到其中的一个线性表结束,然后将剩余的线性表复制到新的线性表中即可。这种基于双指针的归并策略具有较高的时间效率。假设两个有序线性表的长度分别为 m 和 n,在最坏情况下,需要进行 m + n - 1 次比较操作,因此时间复杂度为 O (m + n)。空间复杂度方面,由于需要创建一个新的线性表来存储归并结果,其大小最大为 m + n,所以空间复杂度也为 O (m + n)。同时,在归并过程中额外的操作主要是元素的比较、复制以及指针的移动,这些操作的时间开销相对固定,不会随着数据规模的增加而显著增加,使得该算法在处理大规模有序数据的归并时具有较好的性能表现。

四,示例代码

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int length;
} SqList;// 创建有序顺序表(有序直接插入法)
void CreateOrderedSqList(SqList *L, int arr[], int n) {L->length = 0;for (int i = 0; i < n; i++) {int j = L->length - 1;while (j >= 0 && L->data[j] > arr[i]) {L->data[j + 1] = L->data[j];j--;}L->data[j + 1] = arr[i];L->length++;}
}// 有序顺序表的归并算法
void MergeOrderedSqList(SqList L1, SqList L2, SqList *L3) {int i = 0, j = 0, k = 0;L3->length = 0;while (i < L1.length && j < L2.length) {if (L1.data[i] < L2.data[j]) {if (L3->length == 0 || L1.data[i] != L3->data[L3->length - 1]) {L3->data[L3->length++] = L1.data[i];}i++;} else if (L1.data[i] > L2.data[j]) {if (L3->length == 0 || L2.data[j] != L3->data[L3->length - 1]) {L3->data[L3->length++] = L2.data[j];}j++;} else {if (L3->length == 0 || L1.data[i] != L3->data[L3->length - 1]) {L3->data[L3->length++] = L1.data[i];}i++;j++;}}while (i < L1.length) {if (L3->length == 0 || L1.data[i] != L3->data[L3->length - 1]) {L3->data[L3->length++] = L1.data[i];}i++;}while (j < L2.length) {if (L3->length == 0 || L2.data[j] != L3->data[L3->length - 1]) {L3->data[L3->length++] = L2.data[j];}j++;}
}// 输出顺序表全部元素的算法
void PrintSqList(SqList L) {for (int i = 0; i < L.length; i++) {printf("%d ", L.data[i]);}printf("\n");
}int main() {int arr1[] = {1, 3, 5, 7, 9};int arr2[] = {2, 4, 6, 7, 8, 10};SqList L1, L2, L3;CreateOrderedSqList(&L1, arr1, sizeof(arr1) / sizeof(arr1[0]));CreateOrderedSqList(&L2, arr2, sizeof(arr2) / sizeof(arr2[0]));printf("顺序表L1: ");PrintSqList(L1);printf("顺序表L2: ");PrintSqList(L2);MergeOrderedSqList(L1, L2, &L3);printf("归并后的顺序表L3: ");PrintSqList(L3);return 0;
}

五,运行效果

在这里插入图片描述


http://www.mrgr.cn/news/96743.html

相关文章:

  • android 设置状态栏背景
  • 大模型-提示词(Prompt)技巧
  • OpenLayers:海量图形渲染之矢量切片
  • 4.1学习总结 拼图小游戏+集合进阶
  • 嵌入式EMC设计面试题及参考答案
  • 企业或个人linux服务器搭建
  • kubernetes》》k8s》》Deployment》》ClusterIP、LoadBalancer、Ingress 内部访问、外边访问
  • SOME/IP-SD -- 协议英文原文讲解10
  • 速查Linux常用指令
  • 【Harmonyos】项目开发总结--摇杆拖动侧重实现(适用游戏摇杆)
  • [GESP202503 C++六级题解]:P11963:环线
  • 论文阅读笔记:Denoising Diffusion Implicit Models (3)
  • 利用Canvas在紫微斗数命盘上画出三方四正
  • 大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧
  • 1.2 基于卷积神经网络与SE注意力的轴承故障诊断
  • C++学习day4
  • 企业linux常用服务搭建
  • SSH服务
  • 增加等IO状态的唤醒堆栈打印及缺页异常导致iowait分析
  • 设计模式 三、结构型设计模式