介绍
插入排序是在已排列数列的基础上,将新的元素插入合适的位置。这种算法针对的是具有少量数据而言的,如果数据量太大,且待排序元素是逆序的时候查找和移动元素耗费时间太长。在最坏情况下,这种算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2),辅助空间为 O ( 1 ) O(1) O(1)。但在稳定性方面是稳定的。因此,在时间复杂度为 O ( n 2 ) O(n^2) O(n2)的排序算法中,插入排序算法为最好的算法。
基本思想
插入排序的核心思想是:将一个序列分为两部分,分别由两个变量指向这两部分。前面部分表示已排序的序列,依次选取后面部分序列的元素插入到前面部分中。当然,在插入过程中,如果插入位置不是在序列最后,则需要将从插入位置到最后的所有元素向后移动 😉。
动画演示
直接文字描述可能有点看不懂,我们直接用动画来演示一下插入排序是怎样排序的:
代码
C++版
#include <iostream>
using namespace std;
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
int arr[] = {5, 2, 10, 8, 1};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "原始数组: ";
printArray(arr, n);
insertionSort(arr, n);
cout << "排序后数组: ";
printArray(arr, n);
return 0;
}
Python版
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
# 测试示例
arr = [5, 2, 7, 3, 1]
print("原始数组:", arr)
insertion_sort(arr)
print("排序后数组:", arr)
总结
总的来说,插入排序是一种在所有时间复杂度为 O ( n 2 ) O(n^2) O(n2)中最好的排序算法,如果对你有帮助,那么: