线性表练习之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个递增有序元素组成的顺序表整个有序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248531

相关文章

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

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

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

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

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