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

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

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

相关文章
|
7月前
|
设计模式 算法 Java
【数据结构和算法】删掉一个元素以后全为 1 的最长子数组
这是力扣的 1493 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又又又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。这道题很活灵活现,需要加深对题意的变相理解。给你一个二进制数组nums,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。
115 1
【剑指offer】-调整数组顺序使奇数位于偶数前面-13/67
【剑指offer】-调整数组顺序使奇数位于偶数前面-13/67
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
117 0
|
2月前
|
算法
巧用二维数组进行编号排序以及创建新数组排序编号和一个杨辉三角的实现
巧用二维数组进行编号排序以及创建新数组排序编号和一个杨辉三角的实现
77 1
|
7月前
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
39 0
|
7月前
|
Java
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
66 0
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
|
7月前
【每日一题Day234】LC1171从链表中删去总和值为零的连续节点 | 链表模拟 哈希表+前缀和
【每日一题Day234】LC1171从链表中删去总和值为零的连续节点 | 链表模拟 哈希表+前缀和
42 0
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
69 0
剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面
剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面
55 0