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

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

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

相关文章
【剑指offer】-调整数组顺序使奇数位于偶数前面-13/67
【剑指offer】-调整数组顺序使奇数位于偶数前面-13/67
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
104 0
|
5月前
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
33 0
|
5月前
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
|
5月前
|
Java
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
58 0
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
|
11月前
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
58 0
|
算法
【算法挨揍日记】day10——704. 二分查找、34. 在排序数组中查找元素的第一个和最后一个位置
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
361 0
剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面
剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面
47 0
剑指offer 20. 调整数组顺序使奇数位于偶数前面
剑指offer 20. 调整数组顺序使奇数位于偶数前面
52 0
|
算法
算法 | 妙用递归(顺序&逆序)打印一个数的每一位
- 程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用 - 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问-题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 - 递归的能力在于用有限的语句来定义对象的无限集合 - 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回
237 0
算法 | 妙用递归(顺序&逆序)打印一个数的每一位