核心思想
插入排序是一种通过移动整个数组来交换元素的算法
假设有N个元素,那么它由N-1趟排序组成。
它基于这样的事实: 它将数组分成两个部分,第0~ P-1 个元素是有序的,第P到N-1是无序的。
每一趟排序,我们选择第P个位置的元素,即右边部分取出一个数放到0-~P-1中的一个正确位置。
我们比较这个元素和第0~P-1的元素,在一个循环中一个一个比较,比它大的就后移,遇到比它小的就跳出循环就把这个元素放到比它小的数的后面:
实现算法
思考步骤:
1. 数组划分两个部分
2. P从1到N-1,选择P位置的元素
3. 比较第P个元素和前面0~P-1个元素,有必要就移动
4. 交换tmp和第j个元素(循环结束后的j)
public void insertionSort(int[] A){
if(A==null||A.length<1)
return;
int len=A.length;
int j;
for(int P;P<len;P++){
int tmp=A[P];
for(j=P;j>0&&A[j-1]>tmp;j--){
A[j]=A[j-1];
}
A[j]=tmp;
}
}
性能分析
时间复杂度
最坏 O(N^2)
最好 O(N) ,最好情况就是所有元素都是有序的,那么插入排序中的内部循环就永远不满足判断条件,所以不会移动元素。
实际为:
tmp=A[P];
A[j]=tmp; //j其实就是P,因为没有进入循环
平均复杂度:
O(N^2)
空间复杂度
O(1) 没有使用额外的空间。
稳定性
稳定的, 因为每次比较的是遇到比它小的才交换位置,而且其实是数组整体往后移动来交换。 跟它的值一样的元素与它的相对顺序必然是保持不变的。
举例 {3,4,5,12,5}
排序后:
{3,4,5,5,12}