插入排序
什么是插入排序?
插入排序(Insertion Sort)是一种简单有效的比较排序算法,属于原地排序。其核心思想是:在每次迭代过程中从输入序列中取出一个元素插入到一个有序序列中,形成新的有序序列。重复该过程,直到序列中所有元素都被取出。
解析:
输入序列:就是要排序的一组元素 现在我把它称为N。
有序序列:输入序列的一部分,该部分是有序的(升序或降序) 称为M。
如何插入?: 从“N”中的未排序部分取出一个元素“K”和“M”中的元素比较,插入到正确的位置,该元素“K”和“M”组合形成一个新的有序序列(形成新的“M”)。
图解:
例如:给定一个序列:6 8 1 4 5 3 7 2,按升序排列
6 8 1 4 5 3 7 2 (考虑索引位置0~1) 注意:这时认为6是"M",8将插入到"M"中
第一次排序: 6 8 1 4 5 3 7 2 (考虑索引位置0~2) 这时认为序列(6 8)是"M",1将插入到"M"中
第二次排序: 1 6 8 4 5 3 7 2 (考虑索引位置0~3)
第三次排序: 1 4 6 8 5 3 7 2 重复以上过程,直到序列被排序完成
第四次排序: 1 4 5 6 8 3 7 2
第五次排序: 1 3 4 5 6 8 7 2
第六次排序: 1 3 4 5 6 7 8 2
第七次排序: 1 2 3 4 5 6 7 8 (已排序的序列!)
优点:
从上图分析中我们能得出:
- 数据量较少时效率高。
- 适应性(adaptive):如果输入序列已 预排序(序列中一部分是有序的,例如:图解序列中的6 8两个元素,是有序的),则时间复杂度为O(n+d),d是反转次数(交换次数)。
- 算法的实际运行效率优于选择排序和冒泡排序。这一点是由于它的适应性。
代码:
static void insertionSort(int[] array){
int n = array.length;
int i,j,v;
for (i = 1; i < n; i++) {
/**
* v = array[i]: 表示将要插入到已经排序好的序列中的元素
* 例如:array[2] 将要插入到array[0],array[1]这个有序序列中
*/
v = array[i];
j = i;
while(j>=1 && array[j-1]>v){
//为将要插入的新元素腾出空间。
array[j] = array[j-1];
j--;
}
//将新元素插入到已排序序列中。
array[j] = v;
/**
* 这是为了显示排序结果,自创建的方法,封装在SortUtil中
*/
SortUtil.restOfEach(array, i);
}
/**
* 这是为了显示排序结果,自创建的方法,封装在SortUtil中
*/
SortUtil.afterSort(array);
}
测试:
从控制台输入一个序列:
6 8 1 4 5 3 7 2
结果:
第1次排序:6 8 1 4 5 3 7 2
第2次排序:1 6 8 4 5 3 7 2
第3次排序:1 4 6 8 5 3 7 2
第4次排序:1 4 5 6 8 3 7 2
第5次排序:1 3 4 5 6 8 7 2
第6次排序:1 3 4 5 6 7 8 2
第7次排序:1 2 3 4 5 6 7 8
排序完成的序列:1,2,3,4,5,6,7,8
总结:
上述过程看起来简单,但用代码实现不是那么简单的,希望大家多敲。
有什么更好的实现,请发布在评论中,大家共同进步。
下一篇: excel表格同一单元格里删除重复词