排序-插入排序

插入排序

    public static void main(String[] args){
        //插入排序
        /**
         * 排序值列中的前2个值,并在必要时交换它们。在相对于前2个值(有序的)的适当位置插入值列的第三个值。
         * 然后,在相对于前3个值(有序的)的适当位置插入值列的第4个值。每进行一次插入操作,有序子集中的数值个数将递增1。
         * 重复该过程,直至值列中的所有值都按照次序排列为止。插入过程需要移动数组中的其他值,为插入的元素腾出存储空间。
         */
        int[] b = {23,90,9,25,16};
        insertSort(b);
        for(int i = 0; i < b.length; i++)
            System.out.print(b[i] + " , ");
    }
    


    public static void insertSort(int[] a){
        int j;

        for(int p = 1; p < a.length; p++){

            int temp = a[p];
            for(j = p; (j > 0) && (temp < a[j-1]);j--){
                a[j] = a[j-1];
            }
            a[j] = temp;
        }

        /**
         * 
         * 外层第一次循环p=1,取得数组中的第二个数90,赋值给临时变量temp,内层循环j的初始值为p也就是1,
         * 所以j大于0满足内层循环的第一个条件,而temp的值为90,a[j-1] 等价于a[1-1] ==> a[0]的值为23,也就是90大于23,
         * 第二个条件不满足不会进入循环体,最后把temp的值赋值给a[j],也就是a[j] = temp  ==>  a[1] = 90,
         * 第一轮循环第二个元素的值没有改变, 数组仍为:23,90,9,25,16
         *
         * 外层第二次循环p=2,取得数组中的第三个数9,赋值给临时变量temp,内层循环j的初始值为p也就是2,
         * 所以j大于0满足内层循环的第一个条件,而temp的值为9,a[j-1] 等价于a[2-1] 此时 a[1]的值为90,也就是9小于90,
         * 第二个条件满足进入内循环体,交换:把数组的第二个元素赋值给第三个元素,也就是90放到了数组的第三个元素。
         * 紧接着j--,j的值变为1,再来看内层循环第二次循环的条件是否满足:j>0满足,temp < a[j-1] ==>  temp < a[0] ==> 9< 23 满足
        * 第二次进入内层循环,a[j] = a[j-1]  ==>  a[1] = a[0]  ==> a[0]为23 把23放到了数组第二个元素的位置,
         * 再次j-- ,j的值变了0,内层循环条件不满足,执行外层循环a[j] = temp语句,
         * 因为j此时已经变为0,a[j]就是a[0],把9放到数组的第一个元素的位置
         * 所以外层循环第二轮的结果为:9,23,90,25,16
         *
         * 然后外层进入第三次循环...
         */
    }
posted @ 2013-05-20 22:48  oyiya  阅读(208)  评论(0)    收藏  举报