插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。与冒泡排序和选择排序不同的是,插入排序的排序过程是一边比较一边交换的。插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。
插入排序基本思想是将待排序的元素逐个插入到已经排序好的序列中,直到所有元素都被插入为止。
具体实现过程如下:
1、遍历待排序的数组,将第一个元素视为已经排好序的元素。
2、从第二个元素开始,将其插入已经排好序的数组中的正确位置,使得插入后仍然保持有序。
3、重复步骤2,直到整个数组排序完成。
(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
执行过程请移步文章末尾:排序执行过程。
插入排序的时间复杂度为O(n^2),虽然它不如快速排序、归并排序等排序算法快,但在某些特定情况下,它可能比其他排序算法更高效。例如,当数组的规模比较小或者已经部分有序时,插入排序的效率会更高。
总之,插入排序是一种简单但实用的排序算法,可以用来对小规模数组进行排序,也可以作为其他排序算法的优化策略。
AI编码实现:
本地测试:
为了能够打印排序过程,代码稍作修改。
package com.algorithm.sort;
import java.util.Arrays;
/**
* @author LuoFei
* @className: InsertionSort
* @projectName algorithm
* @description: TODO
* @date 2023/2/19 18:22
*/
public class InsertionSort {
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
System.out.println("第"+i+"轮");
//获取未排序部分的第一个元素
int key = arr[i];
System.out.println("选择"+i+"号位数字“"+key+"”为基准数字,与前面已排序数字比较");
int j = i - 1;
//从右到左遍历已排序的数组,将比key大的元素依次向右移动一位
while (j >= 0) {
System.out.print("比较:["+j+", "+i+"]");
if (arr[j] <= key) {
System.out.println(", 顺序正确");
break;
}
System.out.println(", "+j+" 号位后移一位;");
arr[j + 1] = arr[j];
j--;
}
//将key插入到正确的位置
arr[j + 1] = key;
System.out.println("基准数字”"+key+"“插入"+(j + 1)+"号位置");
System.out.println("新数组:"+ Arrays.toString(arr));
System.out.println("------------------------------------------");
}
}
public static void main(String[] args) {
int arr[] = {5, 2, 8, 3, 9, 1};
System.out.println("插入排序");
System.out.println("初始数组:"+Arrays.toString(arr));
System.out.println("==========================================");
insertionSort(arr);
System.out.println("==========================================");
System.out.print("最终数组:"+Arrays.toString(arr));
}
}
排序执行过程:
插入排序
初始数组:[5, 2, 8, 3, 9, 1]
==========================================
第1轮
选择1号位数字“2”为基准数字,与前面已排序数字比较
比较:[0, 1], 0 号位后移一位;
基准数字”2“插入0号位置
新数组:[2, 5, 8, 3, 9, 1]
------------------------------------------
第2轮
选择2号位数字“8”为基准数字,与前面已排序数字比较
比较:[1, 2], 顺序正确
基准数字”8“插入2号位置
新数组:[2, 5, 8, 3, 9, 1]
------------------------------------------
第3轮
选择3号位数字“3”为基准数字,与前面已排序数字比较
比较:[2, 3], 2 号位后移一位;
比较:[1, 3], 1 号位后移一位;
比较:[0, 3], 顺序正确
基准数字”3“插入1号位置
新数组:[2, 3, 5, 8, 9, 1]
------------------------------------------
第4轮
选择4号位数字“9”为基准数字,与前面已排序数字比较
比较:[3, 4], 顺序正确
基准数字”9“插入4号位置
新数组:[2, 3, 5, 8, 9, 1]
------------------------------------------
第5轮
选择5号位数字“1”为基准数字,与前面已排序数字比较
比较:[4, 5], 4 号位后移一位;
比较:[3, 5], 3 号位后移一位;
比较:[2, 5], 2 号位后移一位;
比较:[1, 5], 1 号位后移一位;
比较:[0, 5], 0 号位后移一位;
基准数字”1“插入0号位置
新数组:[1, 2, 3, 5, 8, 9]
------------------------------------------
==========================================
最终数组:[1, 2, 3, 5, 8, 9]