https://www.youtube.com/watch?v=kU9M51eKSX8
插入排序
插入排序(Insertion Sort)的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
算法描述
具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到下一位置中
- 重复步骤2~5
主意,这个和 selection sort 很像,insertion sort 是从后往前, selection sort 是从前往后。
1 public class InsertionSort { 2 public int[] sort(int[] arr){ 3 if (arr == null) return arr ; 4 //默认第一位(5)已经SORT 好,从第二位(1)开始 倒着往回比较: 如果比 5 小 则把 5 换过来 5 // 5 1 3 6 4 6 for (int i = 1; i < arr.length; i++) { 7 //倒序 J>0 因为下面 有 arr[j-1] 千万小心 8 for (int j = i; j >0; j--) { 9 //swap 5 1 to 1 5 10 if (arr[j]<arr[j-1]){ 11 int temp = arr[j-1]; 12 arr[j-1] = arr[j]; 13 arr[j] = temp ; 14 } 15 } 16 } 17 return arr ; 18 } 19 20 public static void main(String[] args) { 21 InsertionSort insertionSort = new InsertionSort() ; 22 int[] arr = new int[]{5,1,3,6,4} ; 23 int[] res = insertionSort.sort(arr) ; 24 Arrays.stream(res).forEach(a-> System.out.println(a)); 25 } 26 }