目录
前言
排序是重要又较为简单的算法之一,个人认为学习算法建议先学习排序,排序有十种重要的排序方法,有些好,有些坏。
十大排序算法包括哪些
十大排序算法包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。
今天我来讲讲插入排序。
插入排序原理
插入排序是一种简单直观的排序算法,属于内部排序法。其工作原理是将待排序的元素分为两部分:已排序的部分和无序的部分。在排序过程中,将无序部分的每个元素插入到已排序部分的适当位置,以达到排序的目的。
插入排序基本信息
英文名 | insertion sort |
时间复杂度 | O(n^2) |
空间复杂度 | O(1) |
是否稳定 | 是 |
代码实现
代码思路
- 从第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,在已经排序的元素序列中从后向前扫描。
- 如果该元素大于新元素,将该元素移到下一位置。
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
- 将新元素插入到下一位置中。
代码实现
/*头文件部分*/
#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 【模板】排序https://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)的额外空间的排序)。
插入排序的基本步骤
- 从第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于新元素,将该元素移到下一位置。
- 重复步骤2,直到找到已排序的元素小于或者等于新元素的位置。
- 将新元素插入到该位置后。
- 重复步骤2~4。
插入排序的变种
- 直接插入排序:这是最基本的插入排序方法,使用顺序查找法查找当前待排序记录在有序区中的插入位置。
- 折半插入排序:在有序区中查找插入位置时使用二分查找法,提高查找效率。
- 希尔排序:通过比较相隔一定间隔的元素来工作,随着算法进行,逐渐减少间隔直到为1,最后进行一次直接插入排序。
插入排序的性能分析
- 时间复杂度:直接插入排序的最好时间复杂度为O(n)O(n),最坏时间复杂度为O(n2)O(n2),平均时间复杂度为O(n2)O(n2)。
- 空间复杂度:由于是in-place排序,空间复杂度为O(1)O(1)。
- 稳定性:直接插入排序是稳定的排序算法。
你学废了吗?
下期预告:十大排序算法之归并排序。