插入排序

来源:互联网 发布:家庭千兆网络 编辑:程序博客网 时间:2024/05/07 06:05

核心思想

插入排序是一种通过移动整个数组来交换元素的算法
假设有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}

0 0