对分段有序的数组排序(前、后部分分别递增)

news/2024/11/30 18:45:31/

文章目录

  • 1 题目
  • 2 思路
    • 2.1 思路1(直接插入法)
    • 2.2 思路2(归并)
  • 3 实现
    • 3.1 思路1
    • 3.2 思路2

1 题目

设m+n个元素顺序存放在数组A[1…m+n]中,前m个元素递增有序,后n个元素递增有序,试设计一个在时间和空间两方面都尽可能高效的算法,使得整个顺序表递增有序。

2 思路

2.1 思路1(直接插入法)

把数组A看作是两个长度分别为m和n的有序表L1、L2,把L2的每个元素依次插入到L1中的合适位置即可。

  • 1,取表L2中第一个元素A[m+1],暂存为tmp,把tmp插入到L1中合适的位置(L[i]<tmp<L1[i+1]);
  • 2,重复操作1,把A[m+2]、A[m+3]…A[m+n]依次插入到L1中,直至整个数组有序。

时间复杂度:O(mn)
空间复杂度:O(1)

2.2 思路2(归并)

  • 1,把数组A前m个元素和后n个元素视为两个归并段L1、L2,增加一个辅助数组B[1…m+n]存储临时归并的结果。设k1、k2、k3分别指向L1,L2的首位和数组B的下一个结果位置。
  • 2,当k1<=m并且k2<=m+n时,执行3,否则执行4:
    • 3,比较两个归并段指针所指元素的大小,若A[k1]<A[k2],那么B[k3++]=A[k1++],否则B[k3++]=A[k2++],执行2;
    • 4,若k1>m,则把第二归并段剩余的元素复制到数组B末尾;若k2>m+n,则把第一个归并段剩余的元素复制到数组B,最后把数组B复制到数组A。

时间复杂度:O(m+n)
空间复杂度:O(m+n)

3 实现

3.1 思路1

#include<cstdio>void solution1(int *A, int m, int n){int tmp, j;for(int i = m+1; i <= m+n;i++){tmp = A[i];//暂存元素,防止后面移动元素时,元素丢失for(j = i-1;j > 0 && A[j] > tmp;j--)//当L1中的元素大于tmp时,就是插入tmp的位置A[j+1] = A[j];A[j+1] = tmp;}
}void print(int* A, int n){for(int i = 0;i < n;i++){printf("%d ", A[i]);}printf("\n");
}int main(){int A[] = {0, 1,4,7,2,3,6};solution(A, 3, 3);print(A, sizeof(A)/sizeof(A[0]));return 0;
}

3.2 思路2

#include<cstdio>void solution2(int *A, int m, int n){int B[m+n+1];int k1 = 1, k2 = m+1, k3 = 1;//三个指针while(k1<=m && k2<= m+ n){//归并,把较小的元素复制到B中if(A[k1] < A[k2]) B[k3++] = A[k1++];else B[k3++] = A[k2++];}if(k1 > m) //把没有比较完的归并段的剩余元素复制到B中while(k2 <= m+n) B[k3++] = A[k2++];if(k2 > m+n)while(k1 <= m) B[k3++] = A[k1++];for(int i = 1;i <= m+n;i++){//把数组B复制到数组A中A[i] = B[i];}
} void print(int* A, int n){for(int i = 0;i < n;i++){printf("%d ", A[i]);}printf("\n");
}int main(){int A[] = {0, 1,4,7,2,3,6};solution2(A, 3, 3);print(A, sizeof(A)/sizeof(A[0]));return 0;
}

http://www.ppmy.cn/news/1132324.html

相关文章

Python_面向对象

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它将数据和操作数据的方法组合在一起&#xff0c;以便将数据和行为视为一个整体。这种编程范式的历程可以追溯到20世纪60年代&#xff0c;但直到80年代才开始流行。…

机器人过程自动化(RPA)入门 8. 异常处理、调试和日志记录

有时,自动化程序可能无法执行。为了处理此类情况,我们使用异常处理活动。在本章中,我们将从UiPath中可用的各种类型的异常处理方法、您可能遇到的异常以及如何处理它们开始。我们还将学习日志记录。本章涉及的一个重要主题是调试,以检查工作流是否正常工作,并更正任何错误…

【C语言数据结构】栈-链式存储(链栈)

栈-链式存储-链栈 代码实现 代码实现 #include<stdio.h> #include<stdlib.h> #include<stdbool.h>#define ElemType char//定义链栈结构体&#xff0c;并规定栈顶就是链头&#xff0c;一切操作只能在链头进行 typedef struct LNode {//定义数据&#xff0c;…

【租车骑绿道】python实现-附ChatGPT解析

1.题目 租车骑绿道 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车 输入描述 第一行两个数字m、n,自行车限重m,代表部门总…

​为什么流利的英语对于机器学习比数学或编程更重要

​为什么流利的英语对于机器学习比数学或编程更重要 我需要你的帮助&#xff0c;因为我来自多元化的背景&#xff0c;意味着我改变了自己的领域&#xff0c;首先我在学士学位&#xff0c;但后来我转到了和机器学习&#xff0c;这对我来说是新的&#xff0c;但我最终完成了。 …

[管理与领导-107]:IT人看清职场中的隐性规则 - 4 - 职场话术:其实是同一个意思,只是换一种了说法,效果不同,小心被套路

目录 前言&#xff1a; 一、套路和核心思想 1.1 核心思想 1.2 基本原则&#xff1a;让听话者舒服 二、消极变积极的说法 》 自足当下&#xff0c;展望未来 三、委婉拒绝 四、不想接受某项任务 五、正面、让人舒服的表达方式 六、其他 七、职场话术128条&#xff1a;…

黑马程序员RabbitMQ入门到实战教程【基础篇】学习笔记

目录 一、初始MQ 1.1、同步调用 1.2、异步调用 1.3、MQ技术选型 二、RabbitMQ 2.1、安装 2.2、收发消息 2.2.1、交换机 2.2.2、队列 2.2.3、绑定关系 2.2.4、发送消息 2.3、数据隔离 2.3.1、用户管理 2.3.2、virtual host 三、SpringAMQP 3.1、导入Demo工程 3…

1. Flink程序打Jar包

文章目录 步骤注意事项 步骤 用 maven 打 jar 包&#xff0c;需要在 pom.xml 文件中添加打包插件依赖 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><ver…