算导读书笔记——插入排序

基础算法之插入排序

    我觉得《算法导论》一书中对插入排序的描述非常简洁易懂:“插入排序的工作方式像许多人排序一手扑克牌”。

    是的,我们排序手里的扑克牌的方式往往是先在手中握好正确排序的一手扑克,然后将牌堆中的牌依次插入到当前排序中,我们在将牌堆中的牌插入手中的这个过程,就是在做插入排序。

    试想,当前“牌堆”为{6,8,7,56,14,24,5,12},我们要排序的话就得将“牌堆”中的“牌”重新抽取到“手中”。如下过程:(1)首先摸到“6”,接下来摸到“8”我发现,自“6”开始直到结束也找不到比“8”大的数,所以,我将“8”放在了“6”的后面,于是,我手里的牌就变成了{6,8};(2)接下来,我决定继续“摸牌”,于是我摸到了“7”,自左到右,我发现“7”比“6”大,但比“8”小,于是,我将“7”放在了“8”的前面,“8”往后靠了一位。于是,我手里的牌就变成了{6,7,8};(3)按照这个规则,我们可以将余下的所有“牌”放入手中。于是就有了插入排序:

    

public static int[] sort(int[] A){
    //循环摸出牌桌上的牌(循环取出数值A中的数值)
    for(int p = 1; p < A.length; p++){
	    int tmp = A[p];//看到手中的牌为牌堆中的第p个牌
	    int j;//定义当前摸到的牌应该属于我手中的第几个位置
	    for(j = p; j > 0 && tmp < A[j-1] ; j--){
	    /*上面这个循环条件则是为了表述查找最佳位置:因为手中的
	    牌的顺序是固定的,所以j的定义则可以由我摸到的第几张牌来确定,
	    结束的条件则是由查找到手牌中有大于摸到的牌并且手牌循环结束,
	    整个排序结束。*/
		A[j] = A[j-1];//后移一位
            }
            A[j] = tmp;//插入到合适的位置
	}
	return A;
}
	
public static void main(String[] args) {
    int[] arr = {23,4,84,64,7,9,10};
    int[] brr = sort(arr);
    for(int a=0;a<brr.length;a++){
	System.out.println(brr[a]);
	}
}
—— 算法源于生活

猜你喜欢

转载自blog.csdn.net/qq_29884151/article/details/79843543