线性表练习之Example010-使得由前m个递增有序元素和后n个递增有序元素组成的顺序表整个有序

本文主要是介绍线性表练习之Example010-使得由前m个递增有序元素和后n个递增有序元素组成的顺序表整个有序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Example010

原文链接:Example010

题目

设顺序表用数组 A[] 表示,表中元素存储在数组下标 0~m+n-1 的范围内,前 m 个元素递增有序,后 n 个元素也递增有序,设计一个算法,使得整个顺序表有序。

分析

本题考查的知识点:

  • 数组
  • 嵌套 for 循环

分析

  • 将数组 A[] 中的 m+n 个元素(假设元素为 int 型)看成两个顺序表:表L和表R
  • 将数组当前状态看作起始状态,即此时表 LA[] 中前 m 个元素构成,表 RA[] 中后 n 个元素构成。
  • 要使 A[]m+n 个元素整体有序,只需将表R 中的元素逐个插入表 L 中的合适位置即可。
  • 插入过程,取表 R 中的第一个元素 A[m] 存入辅助变量 temp 中,让 temp 逐个与 A[m-1],…,A[0] 进行比较,当 temp<A[j](0≤j≤m-1)时,将 A[j] 后移一位,否则将 temp 存入 A[j+1] 中。
  • 重复上述过程,继续插入 A[m+1]A[m+2],…,A[m+n-1],最终 A[] 中元素整体有序。

图解

请添加图片描述

C实现

核心代码:

/*** 使得整个顺序表有序** @param A 顺序表* @param m 前半部分递增有序的元素个数* @param n 后半部分递增有序的元素个数*/
void moveSort(int A[], int m, int n) {// 从 m 开始,需要移动 n 个数for (int i = m; i < m + n; i++) {// 临时保存要移动的数值int temp = A[i];int j;// 从下标为 i-1 的数开始,将前面的数向后移动一位for (j = i - 1; j >= 0; j--) {// 只移动大于 temp 的数,即不能把下标为 i-1 之前的所有数(包括 i-1 所表示的数)都向后移动一位if (A[j] > temp) {// 用前一位的数覆盖后一位的数A[j + 1] = A[j];} else {// 即遇到 A[j]<=temp 的情况时,跳出循环,停止移动break;}}// 移动之后,A[j+1]就是空出来的位置,填入tempA[j + 1] = temp;}
}

完整代码:

#include <stdio.h>/*** 使得整个顺序表有序** @param A 顺序表* @param m 前半部分递增有序的元素个数* @param n 后半部分递增有序的元素个数*/
void moveSort(int A[], int m, int n) {// 从 m 开始,需要移动 n 个数for (int i = m; i < m + n; i++) {// 临时保存要移动的数值int temp = A[i];int j;// 从下标为 i-1 的数开始,将前面的数向后移动一位for (j = i - 1; j >= 0; j--) {// 只移动大于 temp 的数,即不能把下标为 i-1 之前的所有数(包括 i-1 所表示的数)都向后移动一位if (A[j] > temp) {// 用前一位的数覆盖后一位的数A[j + 1] = A[j];} else {// 即遇到 A[j]<=temp 的情况时,跳出循环,停止移动break;}}// 移动之后,A[j+1]就是空出来的位置,填入tempA[j + 1] = temp;}
}/*** 打印数组* @param arr 待打印的数组* @param len 数组长度*/
void print(int arr[], int len) {printf("[");for (int i = 0; i < len; i++) {printf("%d", arr[i]);if (i != len - 1) {printf(", ");}}printf("]\n");
}int main() {// 创建测试用的数组int A[] = {1, 3, 5, 7, 9, 2, 4, 6, 8};int m = 5, n = 4;print(A, m + n);// 调用函数排序moveSort(A, m, n);print(A, m + n);
}

执行结果:

[1, 3, 5, 7, 9, 2, 4, 6, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Java实现

核心代码:

    /*** 使得整个顺序表有序** @param A 顺序表* @param m 前半部分递增有序的元素个数* @param n 后半部分递增有序的元素个数*/public static void moveSort(int[] A, int m, int n) {// 从 m 开始,需要移动 n 个数for (int i = m; i < m + n; i++) {// 临时保存要移动的数值int temp = A[i];int j;// 从下标为 i-1 的数开始,将前面的数向后移动一位for (j = i - 1; j >=0 0; j--) {// 只移动大于 temp 的数,即不能把下标为 i-1 之前的所有数(包括 i-1 所表示的数)都向后移动一位if (A[j] > temp) {// 用前一位的数覆盖后一位的数A[j + 1] = A[j];} else {// 即遇到 A[j]<=temp 的情况时,跳出循环,停止移动break;}}// 移动之后,A[j+1]就是空出来的位置,填入tempA[j + 1] = temp;}}

完整代码:

import java.util.Arrays;/*** @author lcl100* @create 2022-03-06 16:01*/
public class Test {public static void main(String[] args) {int[] A = new int[]{1, 3, 5, 7, 9, 2, 4, 6, 8};int m = 5, n = 4;System.out.println(Arrays.toString(A));// 打印数组// 调用函数进行移动moveSort(A, m, n);System.out.println(Arrays.toString(A));}/*** 使得整个顺序表有序** @param A 顺序表* @param m 前半部分递增有序的元素个数* @param n 后半部分递增有序的元素个数*/public static void moveSort(int[] A, int m, int n) {// 从 m 开始,需要移动 n 个数for (int i = m; i < m + n; i++) {// 临时保存要移动的数值int temp = A[i];int j;// 从下标为 i-1 的数开始,将前面的数向后移动一位for (j = i - 1; j >= 0; j--) {// 只移动大于 temp 的数,即不能把下标为 i-1 之前的所有数(包括 i-1 所表示的数)都向后移动一位if (A[j] > temp) {// 用前一位的数覆盖后一位的数A[j + 1] = A[j];} else {// 即遇到 A[j]<=temp 的情况时,跳出循环,停止移动break;}}// 移动之后,A[j+1]就是空出来的位置,填入tempA[j + 1] = temp;}}
}

执行结果:

[1, 3, 5, 7, 9, 2, 4, 6, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

这篇关于线性表练习之Example010-使得由前m个递增有序元素和后n个递增有序元素组成的顺序表整个有序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/cnds123321/article/details/123784590
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/248531

相关文章

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2