Java排序算法 [插入排序]

package cn.com.dom4j.sort;

import java.util.Arrays;

public class Test2 {

    /*
     插入排序

     插入排序是最简单的排序算法之一
     插入排序由 N - 1趟排序组成, 对于 p = 1到 N - 1趟, 插入排序保证从 0到位置 p - 1上的元素为已排序状态

     基本思路: 在第 p趟, 我们将位置 p上的元素向左移动, 知道它在前 p + 1个元素中的正确位置被找到的地方
     */
    public static <AnyType extends Comparable<? super AnyType>> void insertionSort_1(AnyType[] arr) {

        for (int i = 1; i < arr.length; i++) {
            for (int j = i; j > 0 && arr[j].compareTo(arr[j - 1]) < 0; j--) {
                swap(arr, j, j - 1);
            }
        }
    }

    /*
     上面排序中存在的缺陷:
        在寻找第 p个元素的正确位置时, 采用了相邻元素比较并交换位置的方式, 这样会产生多余赋值操作

     解决方式:
        记录第 p个元素的值, 逐一和前面元素比较, 比 p大的元素, 位置后移一个 (a[j] = a[j-1]), 直到遇到比 p小的元素.
        最后把 p放在终止时的位置(第一个遇到的比 p小的元素后面)即可
     */

    /**
     * 优化过后的插入排序
     */
    public static <AnyType extends Comparable<? super AnyType>> void insertionSort_2(AnyType[] a) {

        int j;
        for (int p = 1; p < a.length; p++) {
            AnyType tmp = a[p];
            for (j = p; j > 0 && tmp.compareTo(a[j - 1]) < 0; j--)
                a[j] = a[j - 1];
            a[j] = tmp;
        }
    }


    /**
     * 交换数组中两个元素的位置
     */
    public static <AnyType extends Comparable<? super AnyType>> void swap(AnyType[] arr, int i, int j) {
        if (arr == null || arr.length <= 1 || i == j) {
            return;
        }

        AnyType tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}


猜你喜欢

转载自blog.csdn.net/dom4j_/article/details/79816170
今日推荐