题目:对于一个int数组,请编写一个插入排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:[1,2,3,5,2,3],6[1,2,2,3,3,5]
思路:这里所说的插入排序指的是直接插入排序,即将排序后的序列放到数组的前面,对于下一个元素,将其与前面的元素逐一比较,找到合适大小的位置进行插入(要插入到数组中的某个位置会造成后面的元素全部向后面移动一位,于是对于位置i的元素插入到前面的位置j的后面,需要先保存temp=a[i],然后从i-1开始到i-2到j+1,逐一进行相互交换直到temp插入到位置a[j+1])),显然这个方法也是2层循环,外层循环的范围是1~length-1;对于 每个元素目标是将其插入到前面的数组中的合适大小位置,于是会造成已经排序范围的数组向后移动(具体移动过程是先将a[i]保存为temp,然后从后向前进行遍历比较,如果temp<a[k],那么就将a[k]向后移动,直到temp插入到合适的位置。)即冒泡排序是每次遍历前面的数组两两比较交换找出最大值将其移动到后面,有序序列在后面,插入排序是每次遍历后面的元素,将元素插入到前面的有序序列的合适位置,有序序列在前面。插入排序时间复杂度O(n^2),空间复杂度O(1),稳定。
对于直接插入法,是对相邻元素逐个比较和交换。
importjava.util.*;
//插入排序:保持前面有序,对后面的元素遍历,逐个与前面的元素交换直到处于合适的位置
publicclass InsertionSort {
public int[] insertionSort(int[] A, int n){
//特殊输入
if(A==null||A.length<=0) return A;
//外层循环,从i开始,将a[i]向前通过逐个交换插入到合理的位置
for(int i=1;i<A.length;i++){
for(int j=i;j>=1;j--){
//内层循环,从array[i]开始向前找到array[i]正确的位置
if(A[j]<A[j-1]){
//如果A[i]<A[i-1],则进行交换
int temp=A[j];
A[j]=A[j-1];
A[j-1]=temp;
}
}
}
//千万记得返回结果
return A;
}
}
小结:对于选择排序、插入排序、冒泡排序(选X帽),只有冒泡排序将有序序列放在后面,且是将较大值放到后面,其他选择排序,插入排序都是将有序序列放在前面,这3种排序很简单,注意边界情况的确定即可,还是插入排序更加简单。注意在编程时,冒泡排序、插入排序的双层排序的遍历顺序可能是相反的,即一个正向遍历,一个逆向遍历。这只是为了便于理解和写代码而已。
时间复杂度为O(nlogn)的算法:
1.归并排序
2.快速排序
3.堆排序
4.希尔排序