排序算法----插入排序

       插入排序的基本思想是当排到位置 i 的时候,前面的所有元素都是有序的,但不保证都处于最终位置上,即可能后面有可能插入新的元素,而这插入的过程就是当前位置 i 上的元素向前插入,直到不能再插入为止。

       例如一个数组经过几趟插入排序后是[1,3,4,2,6],此时应该排 i = 3,那么元素2就要与前一个元素4比较,发现元素4大于自己,就进行交换。然后在继续向前重复这个过程直到前一个元素小于2或者已经交换到了第一个位置。利用前面元素有序,还可以进行优化,即折半插入排序。

      

package young.unit01;

public class T05_InsertionSort {

    /**
     * 
     * 比较次数 :|最少:数组本来升序      只要比较n-1次
     *        |最多:数组本来逆序      比较1+2+...+(n-1) = n^2
     * 交换次数: |最少    0次
     *        |最多   n^2
     * 时间复杂度   最好(O(N))---只要逐次遍历数组一遍,每遍历一个数只有一次比较操作,常数时间
     *         最坏/平均(O(N^2))---1+2+3+...+(n-1) = n^2 每遍历一个数,比较以及插入次数不同
     *         
     * 稳定性:可以做到稳定性
     * 每插入一个数,在往前面有序数组比较准备插入到合适位置时,发现前面的数小于等于自己时,就停下
     * 也就是相等时不交换 
     * @param: @param nums      
     * @return: void      
     */
    public static void insertionSort(int[] nums) {
        if (nums == null || nums.length < 2) {
            return;
        }
        for (int i = 1; i < nums.length; i++) {
            for (int j = i; j > 0 && nums[j] < nums[j - 1]; j--) {
                swap(nums, j - 1, j);
            }
        }
    }
    
    private static void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

 

posted @ 2018-07-17 14:48  大将军姜伯约  阅读(146)  评论(0)    收藏  举报