算法导论之插入排序

插入排序就想打扑克一样,桌子上的扑克室乱的,我们抓到自己手里的扑克是按照数字顺序排行的。

插入排序的思想是增量方法:在排好子数组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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值