插入排序【c语言】

#include <stdio.h>

void insertSort( int arr[] , int size ) {
int i , j , k , f /*First element*/;
// 0 1 2 3 4
// 4 3,2,1
// 3 4 2,1
// 2 3 4 1

// 1. 遍历无序区域
for ( i = 1; i < size; i++ ) {
f = arr[i] ; // 无序区的第一个元素,与有序区比较
// 2. 遍历有序区域, 找到第一个比无序区大的元素
for ( j = 0; j < i; j++ ) {
if ( f < arr[j] ) {
// 3. 后移,j 以及之后的元素
for ( k = ( i - 1 ); k > j ; k-- ) {
arr[ k + 1 ] = arr[ k ];
}

arr[ j ] = f;
}
}
}
}

void printAll( int arr[], int size ) {
int i =0;

for ( i = 0; i < size; i++ ) {

printf( "%d ", arr[i] );
}

printf( "\n" );
}

void main() {
int arr[] = {3,2,1,2,3, 7,8,9,10 };
int size = sizeof( arr ) / sizeof( int );

printAll( arr, size );
insertSort( arr, size );
printAll( arr, size );
}
<think> 我们参考引用的内容,特别是引用[1]和引用[2]都是关于插入排序的C语言实现。根据引用[1]中的代码和描述,插入排序的基本思路是从第二个元素开始(i=1),将当前元素前面的元素比较,如果当前元素小于前面的元素,则将其插入到前面有序序列的适当位置。 根据引用[2]的描述,插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。实现上通常只需要O(1)的额外空间。 因此,我们可以按照以下步骤实现插入排序: 1. 从数组的第二个元素开始遍历(下标从1开始)。 2. 如果当前元素小于其前一个元素,说明需要将该元素插入到前面有序序列的适当位置。 3. 使用临时变量保存当前元素(temp)。 4. 从当前元素的前一个位置开始向前扫描(下标从i-1开始),将比temp大的元素依次后移,直到找到比temp小的元素或到达数组头部。 5. 将temp插入到找到的位置。 注意:在向后移动元素的过程中,需要同时检查下标是否越界(j>=0)。 根据引用[1]的代码,我们可以写出如下C语言代码: </think> ### C语言实现插入排序 插入排序是一种简单直观的排序算法,工作原理是通过构建有序序列,对未排序数据在已排序序列中从后向前扫描,找到相应位置并插入。以下是详细实现步骤: #### 1. 算法思想 - **核心操作**:将待排序元素插入到已排序序列的适当位置 - **时间复杂度**: - 最优情况(已排序):$O(n)$ - 最坏情况(逆序):$O(n^2)$ - 平均情况:$O(n^2)$ - **空间复杂度**:$O(1)$(原地排序) #### 2. C语言实现代码 ```c #include <stdio.h> void insertion_sort(int arr[], int n) { for (int i = 1; i < n; i++) { // 从第二个元素开始 int key = arr[i]; // 当前待插入元素 int j = i - 1; // 将比key大的元素后移 while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; // 插入到正确位置 } } int main() { int arr[] = {12, 11, 13, 5, 6}; int n = sizeof(arr) / sizeof(arr[0]); insertion_sort(arr, n); printf("排序结果: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` #### 3. 执行过程示例(输入:`[12, 11, 13, 5, 6]`) | 步骤 | 已排序部分 | 待插入元素 | 操作说明 | |------|-------------------|------------|------------------------------| | 初始 | [12] | 11 | 初始化 | | 1 | [11, 12] | 13 | 11插入到12前 | | 2 | [11, 12, 13] | 5 | 13保持原位 | | 3 | [5, 11, 12, 13] | 6 | 5插入最前 | | 结果 | [5, 6, 11, 12, 13] | - | 6插入在5后、11前 | #### 4. 算法特点 - **优点**: - 实现简单,对小规模数据高效 - 稳定排序(相等元素顺序不变) - 自适应:输入数据部分有序时效率高[^2] - **缺点**: - 大规模数据效率低于$O(n \log n)$算法 - 元素移动次数较多 #### 5. 优化方向 - 二分插入:使用二分查找定位插入位置,减少比较次数 - 希尔排序:基于插入排序的分组优化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值