1. 插入排序思想
(1.1)插入排序是一种简单直观的排序方法,其基本思想在于每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成。由插入排序的思想可以引申出三个重要的排序算法:直接插入排序、折半插入排序和希尔排序。
2. 直接插入排序思想及演示过程
https://www.bilibili.com/video/BV14r4y1F71a?p=65
3. 直接插入排序代码实现
1 package cn.sun.it.review; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 public class InsertSort { 7 8 public static void main(String[] args) { 9 // 测试数据:49,38,65,97,76,13,27,49 10 System.out.println("请输入若干个整数,以逗号分隔:"); 11 Scanner sc = new Scanner(System.in); 12 String strNums = sc.nextLine(); 13 String[] tempArrNums = strNums.split(","); 14 int[] arr = new int[tempArrNums.length]; 15 for (int i = 0; i < arr.length; i++) { 16 arr[i] = Integer.valueOf(tempArrNums[i]); 17 } 18 System.out.println("排序前:" + Arrays.toString(arr)); 19 insertSort(arr); 20 System.out.println("排序后:" + Arrays.toString(arr)); 21 } 22 23 private static void insertSort(int[] arr) { 24 int temp; 25 int j; 26 for(int i=1;i<arr.length;i++){ 27 temp = arr[i]; // 把当前待排序元素用一个临时变量temp记录 28 j = i-1; 29 while(j>=0 && temp < arr[j]){ 30 arr[j+1] = arr[j]; // 向后移动一个位置 31 j--; 32 } 33 arr[j+1] = temp; // 把当前待排序元素插入到最终位置 34 } 35 } 36 37 }
4. 测试及输出结果
5. 直接插入排序性能分析
(5.1)空间复杂度:仅使用常数个辅助单元,空间复杂度为O(1);
(5.2)时间复杂度:
- 在最好的情况下,表中元素已经有序,此时每插入一个元素,都只需比较一次而不用移动元素,因而时间复杂度为O(n);
- 在最坏的情况下,表中元素顺序刚好与排序结果中元素顺序相反(逆序)时,总的比较次数达到最大n(n-1)/2次,总的移动次数也达到最大,为n(n-1)/2次。
- 平均情况下,考虑待排序表中元素是随机的,此时可以取上述最好与最坏情况的平均值作为平均情况下的时间复杂度,总的比较次数与总的移动次数均为n2/4。因此,直接插入排序算法的时间复杂度为O(n2),虽然折半插入排序算法的时间复杂度也有O(n2),但对于数据量比较小的排序表,折半插入排序往往能表现出很好的性能。
(5.3)稳定性:由于每次插入元素时总是从后向前先比较再移动,所以不会出现相同元素相对位置发生变化的情况,即直接插入排序是一个稳定的排序方法。
(5.4)适用性:直接插入排序算法适用于顺序存储和链式存储的线性表。当为链式存储时,可以从前往后查找指定元素的位置。注意:大部分排序算法都仅适用于顺序存储的线性表。