插入排序(Insert Sort)
视频讲解链接:【十大排序算法】用可视化动画讲插入排序
1、介绍
将待排序的元素以插入的方式找寻该元素的适当位置,来达到排序的目的。
2、算法步骤
把 n 个待排序的元素看成一个有序序列和一个无序序列,开始时有序序列中只包含一个元素,无序序列中包含有 n-1 个元素,排序过程中每次从无序序列中取出第一个元素,把它的值依次与有序序列元素的值进行比较,将它插入到有序序列中的适当位置,经过n-1轮插入,直到所有元素插入完为止。
3、代码实现
1、Java版代码
package sort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {44,82,37,59,5,36};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int[] arr) {
/**
* compareIndex:比较值的下标
* readyInsertVal:待插入值
* readyInsertIndex:待插入值下标
*/
int compareIndex;
int readyInsertVal;
// 从1开始,循环 n-1 轮,每次从无序序列中选出第一个值作为待插入值
for (int readyInsertIndex = 1; readyInsertIndex < arr.length; readyInsertIndex++) {
// 每轮开始时,比较值为待插入值前一个
compareIndex = readyInsertIndex - 1;
readyInsertVal = arr[readyInsertIndex];
// 找到适当位置,比较值的下标没有越界且待插入值小于比较值
while (compareIndex >= 0 && readyInsertVal < arr[compareIndex]) {
// 后移比较值
arr[compareIndex + 1] = arr[compareIndex];
// 更换比较值为前一个值
compareIndex--;
}
// 待插入值插入到比较值的后面
arr[compareIndex + 1] = readyInsertVal;
}
}
}
2、C语言版代码
#include<stdio.h>
#define len 6
void insertSort(int arr[]) {
/**
* compareIndex:比较值的下标
* readyInsertVal:待插入值
* readyInsertIndex:待插入值下标
*/
int compareIndex;
int readyInsertVal;
int readyInsertIndex;
// 从1开始,循环 n-1 轮,每次从无序序列中选出第一个值作为待插入值
for (readyInsertIndex = 1; readyInsertIndex < len; readyInsertIndex++) {
// 每轮开始时,比较值为待插入值前一个
compareIndex = readyInsertIndex - 1;
readyInsertVal = arr[readyInsertIndex];
// 找到适当位置,比较值的下标没有越界且待插入值小于比较值
while (compareIndex >= 0 && readyInsertVal < arr[compareIndex]) {
// 后移比较值
arr[compareIndex + 1] = arr[compareIndex];
// 更换比较值为前一个值
compareIndex--;
}
// 待插入值插入到比较值的后面
arr[compareIndex + 1] = readyInsertVal;
}
}
int main() {
int arr[] = {44,82,37,59,5,36};
int i;
printf("排序后:\n");
insertSort(arr);
for(i=0; i < len; i++) {
printf("%d ", arr[i]);
}
}
4、时空复杂度
时间复杂度:O(n2)
双层循环
空间复杂度:O(1)
排序过程中只用到几个辅助变量
5、稳定性
插入排序是稳定的排序算法
稳定性:排序前两个值相等的元素的前后位置顺序和排序后它们两个的前后位置顺序相同
6、结束语
打开微信扫描小程序码体验插入排序动画演示: