插入排序是一种简单直观的排序算法,其工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序,即只需用到O(1)的额外空间的排序。在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
插入排序的主要步骤:
- 把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素。
- 排序过程中每次从无序表中取出第一个元素,在有序表中从后往前进行比较。
- 将它插入到有序表中的适当位置,使之成为新的有序表。
插入排序的时间复杂度为O(N),最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(N^2)。平均来说,A[1..j-1]中的一半元素小于A[j],一半元素大于A[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是输入规模的二次函数。
插入排序的空间复杂度为常数阶O(1)。
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
/**
* 数组操作
* @author Administrator
*
*/
public class ArrayOpe {
public static void main(String[] args) {
int[] iArray1 = new int[]{5, 3, 4, 1, 2}; //申明int数组,并初始化值
int[] iArray3 = insertSort(iArray1);//调用插入排序
System.out.println("数组值转字符串:"+Arrays.toString(iArray3));
}
/**
* 插入排序
* @param args
* @return
*/
public static int[] insertSort(int[] args) {//插入排序算法
for(int i=1;i<args.length;i++){
for(int j=i;j>0;j--){
if (args[j]<args[j-1]){
int temp=args[j-1];
args[j-1]=args[j]; //将比args[j]大的数据向后移
args[j]=temp;
}else break;
}
}
return args;
}
}