package com.qirui.algorithm.sort;
/**
* @Description: 插入排序
* 通过构建一个有序序列(通常将第一个元素看做一个有序的序列),对于未排序的元素,在已排序的序列中从后向前扫描,
* 找到相应的位置插入。
*
*
* 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
* 1、从第一个元素开始,该元素可以认为已经被排序
* 2、取出下一个元素,在已经排序的元素序列中从后向前扫描
* 3、如果该元素(已排序)大于新元素,将该元素移到下一位置
* 4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
* 5、将新元素插入到该位置后
* 6、重复步骤2~5
*
* 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。
* 该算法可以认为是插入排序的一个变种,称为二分查找排序。
*/
public class InsertionSort {
public static void insertSort(int[] a) {
int tmp = 0;
for(int i = 1; i < a.length; i++) {
int j = i - 1; // 已排序序列的最后一个元素位置
tmp = a[i]; // 未排序序列的第一个元素
while(j >= 0 && a[j] > tmp) {
a[j + 1] = a[j];
j--;
}
if(j != i - 1) {
a[j + 1] = tmp;
}
}
}
public static void main(String[] args) {
int[] a = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
System.out.println("----------before sort----------");
for(int m = 0; m < a.length; m++) {
System.out.print(a[m] + ", ");
}
System.out.println();
insertSort(a);
System.out.println("----------after sort----------");
for(int m = 0; m < a.length; m++) {
System.out.print(a[m] + ", ");
}
}
}
排序过程图: