定义:直接插入排序,每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
算法:第1次,取出第2个元素与第1个元素比较,如果需要交换,第1个元素后移一个单位,将第2个元素插入到第1个元素的位置。现在前两个元素有序。第2次,取出第3个元素分别与前两个元素比较,如果需要交换,则后移一个单位,将第3个元素插入到最后移动的元素的位置。以此类推,第n-1次,取出第n个元素,分别与前n-1个元素比较,如果需要交换,则后移一个单位,将第n个元素插入到最后移动的元素的位置。
适用范围:元素较少且原数据基本有序。
/**
*
* @param array
* @param asc :true 升序;false 降序
*/
public void insertSort(int [] array,boolean asc){
int arrLen=array.length;
for(int i=1;i<arrLen;i++){
int j=i-1;
int tempItem=array[i];
boolean isAsc=true;
boolean isSwap=false;
while(j>=0){
isAsc=asc?tempItem<array[j]:tempItem>array[j];
if(isAsc){
array[j+1]=array[j];
j--;
isSwap=true;
}
else{
break;
}
}
if(isSwap){
array[j+1]=tempItem;
}
}
}
升序为例:
int array[] ={49,38,65,97,76,13};
insertSort(array,true);
结果简述:
初始序列:
49,38,65,97,76,13
第一次过程中:
取出38与49比较
第1个元素49移动到第2个元素38的位置
49,49,65,97,76,13
第一次结束:
第2个元素38插入到最后移动的元素(第1个元素49)位置
38,49,65,97,76,13
第二次过程中:
取出65
49与65比较,不需要移动。跳出。(不必再比较38与65,因为第一次排序后已经有序)
第二次结束:
38,49,65,97,76,13
第三次过程中:与第二次比较情况相同。
第三次结束:
38,49,65,97,76,13
第四次过程中:
取出76
与97比较,97后移一个单位
38,49,65,97,97,13
与65比较,不需要移动。(无需再比较65之前的元素)
第四次结束:
76插入到元素97的位置
38,49,65,76,97,13
第五次过程中:
取出13
与97比较,97后移一个单位
38,49,65,76,97,97
与76比较,76后移一个单位
38,49,65,76,76,97
与65比较,65后移一个单位
38,49,65,65,76,97
与49比较,49后移一个单位
38,49,49,65,76,97
与38比较,38后移一个单位
38,38,49,65,76,97
第五次结束:
13插入到元素38的位置
13,38,49,65,76,97
排序结束。