插入排序的基本思想是:每次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。依据寻找插入位置方法的不同,有多种不同的插入排序方法。
直接插入排序
基本思想:开始时把第一个数据元素作为初始的有序序列,然后从第二个数据元素开始一次把数据元素按关键字大小插入到已排序的部分排序表的适当位置。当插入第i个数据元素时,前面的i-1个数据元素已经排好序了,这时,用第i个数据元素的关键字与前面的i-1个数据元素的关键字顺序进行比较,找到插入位置后就将第i个数据元素插入。如此进行n-1次插入,就完成了排序。
代码:
public class App
{
public static void main(String[] arg) {
int [] array= {46,31,6,19,23,31};
insertSort(array);
System.out.println(Arrays.toString(array));
}
static void insertSort(int [] array) {
for(int i=1;i<array.length;i++) {
int temp=array[i];
int j=i;
while(j>0 && array[j-1]>temp) {
array[j]=array[j-1];
j--;
}
array[j]=temp;
}
}
}
输出:
[6, 19, 23, 31, 31, 46]
时间复杂度分为最好和最坏的情况。
最好的情况是排序表已经按照关键字从小到大排好序了,时间复杂度为O(n)。
最坏的情况是在第i趟插入时,第i+1个数据元素必须与前面i个数据元素比较,然后移动,此时时间复杂度为O(n^2)。
因此,初始数据表越接近有序,直接插入排序的效率越高。直接插入排序是一种稳定的排序方法。