十大排序算法之插入排序

目录

前言

十大排序算法包括哪些

插入排序原理

插入排序基本信息

代码实现

代码思路

代码实现

实例

【模板】排序

代码

 总结

插入排序的基本步骤

插入排序的变种

插入排序的性能分析


前言

排序是重要又较为简单的算法之一,个人认为学习算法建议先学习排序,排序有十种重要的排序方法,有些好,有些坏。

十大排序算法包括哪些

十大排序算法包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。

今天我来讲讲插入排序。

插入排序原理

插入排序是一种简单直观的排序算法,属于内部排序法。其工作原理是将待排序的元素分为两部分:已排序的部分和无序的部分。在排序过程中,将无序部分的每个元素插入到已排序部分的适当位置,以达到排序的目的。‌

插入排序基本信息

英文名

insertion sort

时间复杂度O(n^2)
空间复杂度O(1)
是否稳定

代码实现

代码思路

  1. 从第一个元素开始,该元素可以认为已经被排序。
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描。
  3. 如果该元素大于新元素,将该元素移到下一位置。
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
  5. 将新元素插入到下一位置中。

代码实现

/*头文件部分*/
#include <iostream>
using namespace std;
/*插入排序部分*/
void insert_sort(int arr[], int len) {
    int i, j, k;
    for (i = 1; i < len; i++) {
        j = i - 1;
        k = arr[i];
        while (j >= 0 && arr[j] > k) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = k;
    }
}

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        cout << "第" << i + 1 << "个数:" << arr[i] << endl;
}
/*主函数部分*/
int main() {
    int a[10000], n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    insert_sort(a, n);
    printArray(a, n);
    return 0;
}

实例

【模板】排序

题目描述

将读入的 N 个数从小到大排序后输出。

输入格式

第一行为一个正整数 N。

第二行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

样例1

样例输入1
5
4 2 4 5 1

样例输出1
1 2 4 4 5

本题来自洛谷题目

P1177 【模板】排序icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P1177

代码

#include <iostream>
using namespace std;
void insert_sort(int arr[], int len) {
    int i, j, k;
    for (i = 1; i < len; i++) {
        j = i - 1;
        k = arr[i];
        while (j >= 0 && arr[j] > k) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = k;
    }
}

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}
int main() {
    int a[10000], n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    insert_sort(a, n);
    printArray(a, n);
    return 0;
}

 总结

插入排序‌是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。

插入排序的基本步骤

  1. 从第一个元素开始,该元素可以认为已经被排序‌。
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描‌,如果该元素(已排序)大于新元素,将该元素移到下一位置。
  3. 重复步骤2,直到找到已排序的元素小于或者等于新元素的位置‌。
  4. 将新元素插入到该位置后‌。
  5. 重复步骤2~4‌。

插入排序的变种

  1. 直接插入排序‌:这是最基本的插入排序方法,使用顺序查找法查找当前待排序记录在有序区中的插入位置。
  2. 折半插入排序‌:在有序区中查找插入位置时使用二分查找法,提高查找效率。
  3. 希尔排序‌:通过比较相隔一定间隔的元素来工作,随着算法进行,逐渐减少间隔直到为1,最后进行一次直接插入排序。

插入排序的性能分析

  • 时间复杂度‌:直接插入排序的最好时间复杂度为O(n)O(n),最坏时间复杂度为O(n2)O(n2),平均时间复杂度为O(n2)O(n2)。
  • 空间复杂度‌:由于是in-place排序,空间复杂度为O(1)O(1)。
  • 稳定性‌:直接插入排序是稳定的排序算法。

你学废了吗?

下期预告:十大排序算法之归并排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值