排序算法(二)

插入排序

流程

  • 外循环:从下标为1的元素开始向后(右)遍历。

  • 内循环:从外循环的下标开始,与前(左)一个值相比。

    1. 若前方值较小,则不变(其实,因为左边已经是有序的了,所以此处可以直接退出内循环。)
    2. 若前方值较大,则交换,并进一步与更前方的值比较。

特点

  1. 适合小规模数组和有序程度高的数组。

  2. 一般作为高级排序算法的中间过程。

  3. 插入的含义体现在内循环时,将当前值插入到有序部分的合适位置。

代码如下

public class Insertion {
    //用于交换数组对应下标的两值
    private static void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
    //用于判断前者是否小于后者,是则返回true
    private static boolean less(Comparable v,Comparable w){
        return v.compareTo(w)<0;
    }
    //用于判断数组是否有序(自然序)
    private static boolean issort(Comparable[] a){
        for(int i=0;i<a.length-1;i++){
            if(less(a[i+1],a[i])){
                return false;
            }
        }
        return true;
    }
    //用于对外提供展示方法
    public static void show(Comparable[] a){
        for(Comparable c:a){
            System.out.println(c);
        }
    }
    //用于对外提供排序的主体方法
    public static void sort(Comparable[] a){
        for(int i=1;i<a.length;i++){
            for(int j=i;j>0&&less(a[j],a[j-1]);j--){
                exch(a,j,j-1);
            }
        }
    }

    public static void main(String[] args) {
        Integer[] a={8,7,6,8,2,4,5,2,1};
        sort(a);
        System.out.println(issort(a));
        show(a);
    }

}
原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/12780298.html