插入排序算法(总结自《算法导论》)
排序问题
输入:n个数的一个序列<a1,a2,…,an>。
输出:输入序列的一个排序<b1,b2,…,bn>,满足b1<b2<b3<…<bn。
伪代码
INSERTIONSORT(A){
for j=1 to A.length-1
key=A[ j ];
i=j-1
while(i>=0&&A[ i ]>key)
A[ i+1 ]=A[ i ];//相当于把A[ j ]提出来放在key里面,然后A[ i+1 ]=A[ i ];
i=i-1; //往前移一位;
A[ i+1 ]=key;//这步放在while外面,因为它不是交换位置,而是相当于把A[j]提出来,等前面
//移完位置后在放入其中。
}//不能用A[j]=A[i],这样会出错。
取自《算法导论》插入排序伪代码
相当于摸牌,从第一张开始摸牌,一张一张的进行摸取,然后插入手中。
java代码(数组实现)
public static void INSERTIONSORTJ(int []A){
int key,i;
for(int j=1;j<A.length;j++) {
key=A[j];
i=j-1;
while(i>=0&&A[i]>key) { //将A[j]提出来,然后将前面的数据往后移动,移动的时候a【i】==a【i+1】;
A[i+1]=A[i];
i=i-1;
}
A[i+1]=key;
}
}
实现过程
先摸取第一张牌5,它不用排序,直接放入手中,然后摸取第二张牌2,5比2大,所以把2放5的前面,代码过程就是先把2提出去放入key中,然后把5往后移一位,这个时候A[1]=A[2];然后把key的值给A[1],他不是冒泡排序那样一直交换位置,而是最后直接把数放到该放的位置。图b中,再摸取一张4,与5比较,依次类推。