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

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

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

相关文章
|
6月前
|
设计模式 算法 Java
【数据结构和算法】删掉一个元素以后全为 1 的最长子数组
这是力扣的 1493 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又又又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。这道题很活灵活现,需要加深对题意的变相理解。给你一个二进制数组nums,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。
97 1
|
API
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和(下)
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和(下)
38 0
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
109 0
|
6月前
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
36 0
|
6月前
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
|
6月前
|
Java
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
62 0
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
62 0
|
Serverless 索引
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和(上)
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和
72 0
|
算法
【算法挨揍日记】day10——704. 二分查找、34. 在排序数组中查找元素的第一个和最后一个位置
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
363 0
剑指offer-2.不修改数组找出重复的数字
剑指offer-2.不修改数组找出重复的数字
46 0