基本数据结构与算法实现JavaAPI【2】-----排序篇

在本篇章中不阐释原理,仅阐述使用java语言实现。

1.冒泡排序(时间复杂度:O(N^2);稳定):

public class sort00 {
    public static void sort(Comparable[] a){
        for(int i=a.length-1;i>0;i--){
            for(int j=0;j<i;j++){
                if(greater(a[j],a[j+1])){
                    exch(a,j,j+1);
                }
            }
        }
    }

    private static void exch(Comparable[] a, int i, int j) {
        Comparable temp=a[i];
        a[i]=a[j];
        a[j]=temp;

    }

    private static boolean greater(Comparable a, Comparable b) {
        return a.compareTo(b)>0;
    }

}

2.选择排序:(时间复杂度:O(N^2);不稳定):
public class sort01 {
    public static void sort(Comparable[] a){
        for (int i = 0; i <a.length-1 ; i++) {
            int minindex=i;
            for(int j=i+1;j<a.length;j++){
                if(greater(a[minindex],a[j])){
                    minindex=j;
                }
            }
            exch(a,i,minindex);
        }
    }

    private static void exch(Comparable[] a, int i, int j) {
        Comparable temp=a[i];
        a[i]=a[j];
        a[j]=temp;

    }

    private static boolean greater(Comparable a, Comparable b) {
        return a.compareTo(b)>0;
    }

}

3.插入排序:(时间复杂度:O(N^2);稳定)

public class sort02 {
    public static void sort(Comparable[] a){
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = i; j >=0 ; j--) {
                if(geater(a[j],a[j+1])){
                    exch(a,j,j+1);
                }
            }
        }
    }


    private static void exch(Comparable[] a,int i,int j){
        Comparable temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }

    private static boolean geater(Comparable a,Comparable b){
        return a.compareTo(b)>0;
    }
}

4.希尔排序(不稳定)

public class sort03 {

    public static void sort(Comparable[] a){
        //1.由数组a的长度确定增长量h的初始值
        int h=1;
        while (h<a.length/2){
            h=2*h+1;
        }
        //2.希尔排序
        while (h>=1){
            //排序
            //找到待插入的元素
            for (int i = h; i < a.length; i++) {
                //把待插入的元素插入到有序数列中
                for (int j = i; j >=h ; j-=h) {
                    //带插入元素是a[j],比较a[j]和a[j-h]
                    if(geater(a[j-h],a[j])){
                        //交换元素
                        exch(a,j-h,j);
                    }else {
                        //待插入元素已经找到了合适的位置,结束循环
                        break;
                    }
                }
            }

            //减小h的值
            h=h/2;
        }
    }

    private static void exch(Comparable[] a,int i,int j){
        Comparable temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }

    private static boolean geater(Comparable a,Comparable b){
        return a.compareTo(b)>0;
    }

}


版权声明:本文为qq_55865959原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。