插入排序是一种简单直观的排序算法,其基本思想是将一个待排序的数组分为已排序区间和未排序区间,每次从未排序区间中取出一个元素,插入到已排序区间的适当位置,直到所有元素都被插入到已排序区间为止。
插入排序的实现可以采用两种方式:一种是直接插入排序,另一种是希尔排序。
1、直接插入排序
直接插入排序的实现非常直观,可以按照以下步骤进行:
- 将第一个元素看作已排序区间,将剩余的元素看作未排序区间;
- 依次从未排序区间中取出一个元素,将它插入到已排序区间的适当位置,使得插入后仍然保持已排序区间从小到大的顺序;
- 重复步骤2,直到所有元素都被插入到已排序区间为止。
2、希尔排序
希尔排序是一种改进版的插入排序算法,其思想是将待排序数组按照一定的间隔分成若干个子数组,对每个子数组分别进行插入排序,然后缩小间隔,继续进行插入排序,直到间隔为1,最后进行一次插入排序即可。
下面分别是Java、C++和Python实现插入排序的示例代码:
Java代码:
public class InsertionSort {
public static void insertionSort(int[] arr) {
int n = arr.length;
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 = j - 1;
}
arr[j + 1] = key;
}
}
}
C++代码:
#include <iostream>
#include <vector>
using namespace std;
void insertionSort(vector<int>& arr) {
int n = arr.size();
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 = j - 1;
}
arr[j + 1] = key;
}
}
Python代码:
def insertionSort(arr):
n = len(arr)
for i in range(1, n):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j = j - 1
arr[j + 1] = key