版权声明:转载请声明: https://blog.csdn.net/MingJieZuo/article/details/83418342
一、概述
本节主要简单介绍一下直接插入排序算法,直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。摘自百度百科。
二、分析
假如现在有一个具有n+1个元素的序表,即table[0, n],现将该序表组成元素分为有序和待排序两部分,默认即tableSorted[0, 1)和tableToBeSorted[1, n],随后我们将tableToBeSorted待排序列表中的第0个元素插入到tableSorted有序列表之中,组成新的有序列表和待排序列表,即tableSorted[0, 1]和tableToBeSorted[2, n],重复此操作,直到待排序列表元素个数为0,即序表元素全部有序
三、代码展示
根据自己对于直接插入排序算法的理解,我将算法思路分成了三步,首先我们需要确定待排序数字在有序列表中的插入位置,其次我们将有序列表中该位置后的元素统一往后挪一位,最后我们将待排序数字放在该位置上,正序代码如下:
// 这是根据定义写的思路代码,不是最终代码
private static int[] insertionSort(int[] dataToBeSorted) {
int length = dataToBeSorted.length;
for(int i=1; i<length; i++) {
// 将待排序数字保存起来
int temp = dataToBeSorted[i];
// 记录插入的位置
int index = i;
for(int j=i-1; j>=0; j--){
// 为了更直观,判断语句就不放在循环体里了
if(dataToBeSorted[j] > dataToBeSorted[i]){
// 记录待排序数字应该插入的位置
index--;
}else{
break;
}
}
if(index != i){
// 在有序数列里,将插入位置后面的数字,统一往后挪一位
for(; i>index; i--){
dataToBeSorted[i] = dataToBeSorted[i-1];
}
// 在需要插入的位置上,赋值
dataToBeSorted[index] = temp;
}
}
return dataToBeSorted;
}
虽然功能实现了,但代码却存在着很大的问题,首先在时间复杂度上,我们进行了三次循环,其次在空间复杂度上我们使用了temp、index两个中间变量存储值,所以这样写效率很低。之后我再想,能不能在获取插入位置的时候,就直接挪位呢?当然看了看网上的写法[流汗][哈哈],最后代码如下
private static int[] insertionSort(int[] dataToBeSorted) {
int length = dataToBeSorted.length;
for(int i=1; i<length; i++) {
int temp = dataToBeSorted[i];
int j = i-1;
// 如果待排序的数字小于前面紧挨的数字
for(; j>=0 && temp<dataToBeSorted[j]; j--){
// 前面的数字将后面的数字覆盖掉,相当于往后挪了一位
dataToBeSorted[j+1] = dataToBeSorted[j];
}
// 如果有序列表有数字挪位了,即需要做插入操作了
if(j != i-1){
// 将待排序数字插入到相应位置
dataToBeSorted[j+1] = temp;
}
}
return dataToBeSorted;
}
四、总结
当然代码编写并不是固定的,肯定会有很多变形格式,其实我们研究的也是其直接插入的思想和每种写法的效率问题。如果想要查看更多算法基础,去我的博客目录里查看吧,因为关于每块知识点的介绍,博客单节写的比较零散,不容易查找。