hnust 1813: 算法10-1:直接插入排序

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)算法,插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。以下是对代码的详细解析:

  1. 函数定义

    • insertSort(int a[], int len):这是插入排序的函数,接收一个整数数组 a 和数组的长度 len 作为参数。
  2. 外层循环

    • for (int i = 1; i < len; i++):从数组的第二个元素开始,直到最后一个元素。索引 i 表示当前要插入的元素。
  3. 内层循环

    • while (j && a[j - 1] > a[j]):使用 while 循环从当前元素 a[j] 向前扫描已排序的部分(即索引 j 之前的部分)。
    • 如果前一个元素 a[j - 1] 比当前元素 a[j] 大,说明找到了当前元素的正确位置。
  4. 元素交换

    • swap(a[j], a[j - 1]):使用 swap 函数交换当前元素和它前面不小于它的元素。
  5. 更新索引

    • j--:内层循环中,每次交换后,更新索引 j 为前一个元素的索引,继续向前扫描。
  6. 循环继续

    • 外层循环继续,将下一个元素插入到已排序的数组中,直到所有元素都被扫描和插入。
  7. swap 函数

    • 代码中没有给出 swap 函数的实现,但它应该是一个交换两个数组元素的函数。
  8. 算法性能

    • 插入排序的平均时间复杂度和最坏情况时间复杂度都是 O(n^2),其中 n 是数组的长度。
    • 尽管对于小规模数据或基本有序的数据集,插入排序可以表现得非常高效。
  9. 稳定性

    • 插入排序是稳定的排序算法,因为它不会改变相同元素之间的顺序。
  10. 适用场景

    • 插入排序适用于数据量较小或者数据基本有序的情况,此时它的效率可以与线性时间复杂度的算法相媲美。

插入排序是一种基础的排序算法,由于其实现简单和对小规模数据集的良好性能,它在实际编程中仍然有着广泛的应用。然而,对于大规模数据集,更高效的排序算法(如快速排序、归并排序等)可能是更好的选择。

部分代码

代码如下( 题干模板):

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值