插入排序就想打扑克一样,桌子上的扑克室乱的,我们抓到自己手里的扑克是按照数字顺序排行的。
插入排序的思想是增量方法:在排好子数组A[1…j-1]后,将元素A[j]插入,形成排好序的子数组. 如下图:
伪代码
INSERT-SORT(A)
for j=2 to A.length
key=a[j]
i=j-1;
while i>0 and A[i]>key
A[i+1]=A[i]
i=i-1
A[i+1]=key
/**
* 这里以顺序排序为例
* 在排好子数组A[1…j-1]后,将元素A[j]插入,形成排好序的子数组
* 需要排序的第j和元素一次和前面的每个元素进行比较(从j-1逆序往前),依次把大于key的值往后拉
* 拉完之后,最后需要将key替换到合适的位置(第i+1)
* O(n2)
*/
public class InsertSort {
public void insertSort(int a[]) {
int key;
int i;
for(int j=1;j<a.length;j++){
key=a[j];
i=j-1;
//i是j-1,i是从后往前(所以下面i=i-1)下面a[i+1]=key是将A[j]插入已排序数组A[1…j-1]
while(i>=0 && a[i]>key)
{
a[i+1]=a[i];//后面的那个数被替换了,相当于前面有序的A[1…j-1]中连续数据部分,大于key的(a[j])的往后挪
//直接移动替换没事,因为前面的key把元素记住了
i=i-1;//要把当前要排的元素(第j个)排到该在的位置
}
//上面是找到第j个数字合适的插入位置i+1
a[i+1]=key;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
InsertSort sort=new InsertSort();
int a[]={3,1,2,8,2,10,4,11};
sort.insertSort(a);
for(int k=0;k<a.length;k++){
System.out.print(a[k]+" ");
}
}
}
下面例子是为了理解上面双重循环,下面只是比较典型的某一轮循环
举例说明A={5,2,4,6}
A[1..j-1]是在手中排好序的,A[j..n]是桌子上的未排序的
5, 2,4,6 到 5,5,4,6 到 2,5,4,6
2,5 4,6 到2,5,5,6 到2,4,5,6
2,4,5 6 不满足while第二个条件直接2,4,5,6