直接插入排序应用了插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
直接插入排序算法的基本思想:
在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
1.简单方法
首先在当前有序区arr[0..i-1]中查找arr[i]的正确插入位置j(0≤j≤i-1);然后将arr[j..i-1]中的记录均后移一个位置,腾出j位置上的空间插入arr[i]。
注意:
若arr[i]的关键字大于等于arr[0..i-1]中所有记录的关键字,arr[i]就是插入原位置。
2.改进的方法
一种查找比较操作和记录移动操作交替地进行的方法。
具体做法:
将待插入记录arr[i]的关键字从右向左依次与有序区中记录arr[j](j=i-1,i-2,…,0)的关键字进行比较:
① 若arr[j]的关键字大于arr[i]的关键字,则将arr[j]后移一个位置;
② 若arr[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为arr[i]的插入位置。
1 package com.bingoogol.algorithm.sort; 2 3 /** 4 * 直接插入排序 5 * 6 * @author bingoogol@sina.com 7 */ 8 public class InsertSort { 9 10 public static void main(String[] args) { 11 int[] arr = new int[] { 2, 6, 30, 25, 9, 18, 13 }; 12 System.out.print("排序前:"); 13 InsertSort.printArr(arr); 14 InsertSort.sort(arr); 15 System.out.print("排序后:"); 16 InsertSort.printArr(arr); 17 } 18 19 public static void sort(int[] arr) { 20 for (int i = 1; i < arr.length; i++) { 21 int temp = arr[i]; 22 int j = i - 1; 23 while (j >= 0 && arr[j] > temp) { 24 arr[j + 1] = arr[j]; 25 j--; 26 } 27 arr[j + 1] = temp; 28 } 29 } 30 31 public static void swap(int[] data, int i, int j) { 32 int temp = data[i]; 33 data[i] = data[j]; 34 data[j] = temp; 35 } 36 37 public static void printArr(int[] arr) { 38 for (int i = 0; i < arr.length - 1; i++) { 39 System.out.print(arr[i] + ","); 40 } 41 System.out.println(arr[arr.length - 1]); 42 } 43 }