现在,我怕的并不是那艰苦严峻的生活,而是不能再学习和认识我迫切想了解的世界。对我来说,不学习,毋宁死。——罗蒙诺索夫
插入排序是最简单的排序算法之一。它由N-1趟排序组成。对于p=1到N-1趟,插入排序保证从位置0到位置p上的元素为已排序状态。具体的步骤如下:
- 从第一个元素开始,该元素可以认为是有序的。
- 取出下一个元素,对数组下标1处的元素进行排序,即在已经排序的元素序列中从后向前扫描,如果该元素小于前面的元素,则依次与前面元素进行比较如果小于则交换,直到找到大于该元素的就则停止。
- 如果该元素大于前面的元素,则重复步骤2
- 重复步骤2-3知道所有元素都排好序。
代码
public static void insertSort(T[] array){
int n = array.length;
for(int i=1;i<n;i++){
for(j=i;j>0;j--){
if(array[j].CompareTo(array[j-1])<0){
swap(array,j,j-1);
}else{
break;
}
}
}
}
private static void swap(T[] array,int i, int min){
T temp = array[i];
array[i] = array[min];
array[min] = temp;
}
插入排序算法优化
其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置。
public static <T extends Comparable<? super T>> void insertSort(T[] a){
for(int p = 1; p < a.length; p++)
{
T tmp = a[p];//保存当前位置p的元素,其中[0,p-1]已经有序
int j;
for(j = p; j > 0 && tmp.compareTo(a[j-1]) < 0; j--)
{
a[j] = a[j-1];//后移一位
}
a[j] = tmp;//插入到合适的位置
}
}