基本思想
- 将一个记录插入到已排序的有序表中,从而得到一个新的记录数据增1的有序表
- n-1趟插入:先将序列中的第一个记录看成一个有序的子序列,然后从第二个记录逐个插入,直到整个序列编程按关键字非递减有序序列为止。
具体步骤
- 例如第i个元素是待排序的元素,则前i-1个元素是已经非递减排列的序列,将第i个元素插入到前面已经排好的序列中,
- 该元素从第i-1个元素进行比较,如果大于第i-1个元素,则直接插入;
- 如果小于,则第i-1的元素向后移一位,同时比较与第i-2元素的大小,依次向前比较,直到排在了正确的位置。
- 在比较之前,要将可能发生右移的待排序元素建立监视哨。
代码如下
package sort_book_datastruction;
import java.util.Arrays;
/**
* 插入排序:主要是将待排序的元素插入到已经排好序的列表中,从而编程长度加1的有序表;
* 具体步骤:例如第i个元素是待排序的元素,则前i-1个元素是已经非递减排列的序列,将第i个元素插入到前面已经排好的序列中,
* 该元素从第i-1个元素进行比较,如果大于第i-1个元素,则直接插入;
* 如果小于,则第i-1的元素向后移一位,同时比较与第i-2元素的大小,依次向前比较,直到排在了正确的位置。
* 在比较之前,要将可能发生右移的待排序元素建立监视哨。
* @author Administrator
*/
public class InsertSort {
public void insertSort(int[] array){
int length = array.length;
for(int i = 1;i<length;++i){
if(array[i]<array[i-1]){
int j = i-1;
int key = array[i];
while(array[j]>key){
array[j+1] =array[j];
j--;
}
array[j+1] = key;
}
}
}
/**
* 折半插入排序
* @param array
*/
public void insertSort2(int[] array){
int length = array.length;
for(int i =1;i<length;i++){
int key = array[i];
int j = i-1;
int low = 0,high = j;
while(low<=high){
int m = (high - low)/2+low;
if(key<array[m]) high = m-1;
else low = m+1;
}
while(j>=high+1){
array[j+1] = array[j];
j--;
}
array[j+1]=key;
}
}
public static void main(String[] args) {
InsertSort is = new InsertSort();
int[] a={2,5,3,8,11,6,15,9,45,7,5};
is.insertSort(a);
System.out.println(Arrays.toString(a));
}
}
算法分析
- 算法稳定
- 平均的时间复杂度为O(n^2)
- 辅助空间为O(1)