hnust 1813: 算法10-1:直接插入排序
题目描述
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的且记录数增加了1的有序表。
其算法可以描述如下:
在本题中,读入一串整数,将其使用以上描述的直接插入排序的方法从小到大排序,并输出。
输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过1000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
10
2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
提示
在本题中,需要按照题目描述中的算法完成直接插入排序的算法。直接插入排序算法的思路非常直接,就是通过将记录插入到已经有序的有序表中,并重排记录。
通过分析,不难发现直接插入排序的时间复杂度为O(n2),并不是一种非常高效的排序方法。
解题过程
这段代码实现了插入排序(Insertion Sort)算法,插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。以下是对代码的详细解析:
-
函数定义:
insertSort(int a[], int len)
:这是插入排序的函数,接收一个整数数组a
和数组的长度len
作为参数。
-
外层循环:
for (int i = 1; i < len; i++)
:从数组的第二个元素开始,直到最后一个元素。索引i
表示当前要插入的元素。
-
内层循环:
while (j && a[j - 1] > a[j])
:使用while
循环从当前元素a[j]
向前扫描已排序的部分(即索引j
之前的部分)。- 如果前一个元素
a[j - 1]
比当前元素a[j]
大,说明找到了当前元素的正确位置。
-
元素交换:
swap(a[j], a[j - 1])
:使用swap
函数交换当前元素和它前面不小于它的元素。
-
更新索引:
j--
:内层循环中,每次交换后,更新索引j
为前一个元素的索引,继续向前扫描。
-
循环继续:
- 外层循环继续,将下一个元素插入到已排序的数组中,直到所有元素都被扫描和插入。
-
swap
函数:- 代码中没有给出
swap
函数的实现,但它应该是一个交换两个数组元素的函数。
- 代码中没有给出
-
算法性能:
- 插入排序的平均时间复杂度和最坏情况时间复杂度都是 O(n^2),其中 n 是数组的长度。
- 尽管对于小规模数据或基本有序的数据集,插入排序可以表现得非常高效。
-
稳定性:
- 插入排序是稳定的排序算法,因为它不会改变相同元素之间的顺序。
-
适用场景:
- 插入排序适用于数据量较小或者数据基本有序的情况,此时它的效率可以与线性时间复杂度的算法相媲美。
插入排序是一种基础的排序算法,由于其实现简单和对小规模数据集的良好性能,它在实际编程中仍然有着广泛的应用。然而,对于大规模数据集,更高效的排序算法(如快速排序、归并排序等)可能是更好的选择。
部分代码
代码如下( 题干模板):
void insertSort(int a[], int len){
for (int i = 1; i < len; i++){
int j = i;
while (j && a[j - 1] > a[j]){
swap(a[j], a[j - 1]);
j --;
}
}
}
---
## AC代码
```c
#include <bits/stdc++.h>
using namespace std;
int a[1010];
void insertSort(int a[], int len){
for (int i = 1; i < len; i++){
int j = i;
while (j && a[j - 1] > a[j]){
swap(a[j], a[j - 1]);
j --;
}
}
}
int main(){
int n;
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
insertSort(a, n);
for (int i = 0; i < n; i ++) cout << a[i] << ' ';
return 0;
}