有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

简介: 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

C语言实现


方法一:直接遍历插入


这种方法直接遍历数组,找到合适的位置插入新元素,然后移动后续元素。


c复制代码
 #include <stdio.h>  
 
   
 
 void insertSorted(int arr[], int *n, int elem) {  
 
     int i;  
 
     // 数组扩容(这里假设数组足够大,不进行动态扩容)  
 
     // 如果需要动态扩容,则需要在函数外部处理  
 
     (*n)++;  
 
   
 
     // 从后向前遍历,找到插入位置  
 
     for (i = *n - 1; (i > 0 && arr[i - 1] > elem); i--) {  
 
         arr[i] = arr[i - 1];  
 
     }  
 
     arr[i] = elem;  
 
 }  
 
   
 
 int main() {  
 
     int arr[] = {1, 3, 5, 7, 9};  
 
     int n = sizeof(arr) / sizeof(arr[0]);  
 
     int elem = 4;  
 
   
 
     insertSorted(arr, &n, elem);  
 
   
 
     for (int i = 0; i < n; i++) {  
 
         printf("%d ", arr[i]);  
 
     }  
 
     return 0;  
 
 }



方法二:二分查找插入位置


由于数组已排序,可以使用二分查找来找到插入位置,然后插入。


c复制代码
 #include <stdio.h>  
 
   
 
 void insertSortedBinary(int arr[], int *n, int elem) {  
 
     int low = 0, high = *n - 1, mid;  
 
     // 二分查找插入位置  
 
     while (low <= high) {  
 
         mid = (low + high) / 2;  
 
         if (arr[mid] == elem) {  
 
             // 如果元素已存在,则不插入  
 
             return;  
 
         } else if (arr[mid] < elem) {  
 
             low = mid + 1;  
 
         } else {  
 
             high = mid - 1;  
 
         }  
 
     }  
 
   
 
     // 数组扩容(这里假设数组足够大)  
 
     (*n)++;  
 
   
 
     // 插入元素并移动后续元素  
 
     for (int i = *n - 1; i > low; i--) {  
 
         arr[i] = arr[i - 1];  
 
     }  
 
     arr[low] = elem;  
 
 }  
 
   
 
 int main() {  
 
     // 示例代码与上述相同  
 
 }


Python实现


方法一:直接遍历插入


Python 的列表操作比 C 语言更方便,可以直接使用 insert() 方法。


python复制代码
 def insert_sorted(arr, elem):  
 
     arr.append(float('inf'))  # 临时添加一个极大值,简化插入逻辑  
 
     i = len(arr) - 2  
 
     while arr[i] > elem:  
 
         arr[i + 1] = arr[i]  
 
         i -= 1  
 
     arr[i + 1] = elem  
 
     arr.pop()  # 移除临时添加的极大值  
 
   
 
 # 示例  
 
 arr = [1, 3, 5, 7, 9]  
 
 elem = 4  
 
 insert_sorted(arr, elem)  
 
 print(arr)

image.png


方法二:二分查找插入位置


Python 的 bisect 模块提供了二分查找的支持,可以直接用于找到插入位置。


python复制代码
 from bisect import insort  
 
   
 
 # 示例  
 
 arr = [1, 3, 5, 7, 9]  
 
 elem = 4  
 
 insort(arr, elem)  
 
 print(arr)



这里 insort() 函数直接完成了查找插入位置并插入元素的操作,非常简洁。


image.png

相关文章
|
11月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
383 5
|
消息中间件 存储 分布式计算
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
286 4
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第21天】本文旨在深入探讨深度学习领域的核心组成部分——卷积神经网络(CNN)。通过分析CNN的基本结构、工作原理以及在图像识别、语音处理等领域的广泛应用,我们不仅能够理解其背后的技术原理,还能把握其在现实世界问题解决中的强大能力。文章将用浅显的语言和生动的例子带领读者一步步走进CNN的世界,揭示这一技术如何改变我们的生活和工作方式。
|
设计模式 API Python
Python Web:Django、Flask和FastAPI框架对比
Python Web:Django、Flask和FastAPI框架对比
462 0
|
12月前
|
数据可视化 测试技术 API
软件测试中的自动化测试框架选择与实践
在当今快节奏的软件开发环境中,自动化测试成为了确保软件质量和加速交付的关键。本文将探讨自动化测试的重要性,并比较几种流行的自动化测试框架,包括Selenium、Appium和TestComplete。文章还将提供一些最佳实践和案例研究,以帮助读者更好地理解和实施自动化测试策略。
|
人工智能 算法 C语言
详解树状数组(C/C++)
详解树状数组(C/C++)
|
存储 网络协议 Cloud Native
ClickHouse Keeper 源码解析
ClickHouse 社区在21.8版本中引入了 ClickHouse Keeper。ClickHouse Keeper 是完全兼容 Zookeeper 协议的分布式协调服务。本文对开源版本 ClickHouse v21.8.10.19-lts 源码进行了解析。
ClickHouse Keeper 源码解析
|
区块链
webp2jpg网页在线图片格式转换源码
webp2jpg-免费在线图片格式转化器, 可将jpeg、jpg、png、gif、 webp、svg、ico、bmp文件转化为jpeg、png、webp、webp动画、gif文件。 无需上传文件,本地即可完成转换!
223 0
|
Linux 数据安全/隐私保护 Windows
【远程编辑工具UE】超好用的工具UltraEdit(UE)远程连接Linux的方法,以及FTP Component Failuer连接失败的解决方法
【远程编辑工具UE】超好用的工具UltraEdit(UE)远程连接Linux的方法,以及FTP Component Failuer连接失败的解决方法
752 0
【远程编辑工具UE】超好用的工具UltraEdit(UE)远程连接Linux的方法,以及FTP Component Failuer连接失败的解决方法
|
存储 程序员 Python
Python函数定义与调用详解
Python中的函数是可重用代码块,用于接收参数、执行操作并可能返回输出。通过`def`定义函数,如`def greet(name): print(f&quot;Hello, {name}!&quot;)`。函数可接受任意数量的参数,包括默认值。调用函数时提供参数,如`greet(&quot;Alice&quot;)`。可变参数通过星号(*)和双星号(**)实现。函数有助于代码模块化、理解和维护。掌握函数是Python编程基础。