JAVA實現常用排序

1.冒泡排序

package com.lyc.BubbleSort;

/**
 * 冒泡排序,從小到大排序,時間複雜度爲O(N^2)
 * 原理:比較相鄰兩個元素,如果前一個元素比後一個元素大,則交換這兩個元素的值
 *       對每一對相鄰元素做同樣的工作,從開始第一對元素到結尾的最後一對元素。
 *       最終最後的位置就是最大值。
 * @author lyc
 * @create 2020-04-14 14:38
 */
public class BubbleSort {

    /*
        對數組a中元素進行排序
     */
    public static void sort(Comparable[] a){
        /*for(int i=0;i<a.length-1;i++){
            for(int j=0;j<a.length-1-i;j++){
                if(greater(a[j],a[j+1])){
                    exch(a,j,j+1);
                }
            }
        }*/
        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);
                }
            }

        }

    }

    /*
        比較v元素是否大於w元素
     */
    private static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }

    /*
        交換a數組中索引i和j處的值
     */
    private static void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}

2.選擇排序

package com.lyc.selectionSort;

/**
 * 選擇排序,時間複雜度O(N^2)
 * 原理:1.每一次遍歷的過程中,都假定第一個索引處的元素是最小值,和其他索引處的值
 *      依次進行比較,如果當前索引處的值大於其他索引處的值,則假定其他索引處的
 *      值爲最小值,最後可以找到最小值所在的索引。
 *      2.交換第一個索引處和最小值所在的索引處的值。
 * @author lyc
 * @create 2020-04-14 15:07
 */
public class SelectionSort {

    /*
     對數組a中元素進行排序
   */
    public static void sort(Comparable[] a){
        for(int i=0;i<a.length-1;i++){
            //假定本次遍歷,最小值所在的索引是i
            int minIndex=i;
            for(int j=i+1;j<a.length;j++){
                if(greater(a[minIndex],a[j])){
                    //更換最小值所在索引
                    minIndex=j;
                }
            }
            //交換i和minIndex處的值
            exch(a,minIndex,i);
        }
    }

    /*
        比較v元素是否大於w元素
     */
    private static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }

    /*
        交換a數組中索引i和j處的值
     */
    private static void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }

}

3.插入排序

package com.lyc.InsertionSort;

/**
 * 插入排序 ,時間複雜度O(N^2)
 * 原理:1.把所有的元素分爲兩組,已經排序的和未排序的;
 *      2.找到未排序的組中的第一個元素,向已經排序的組中進行插入;
 *      3.倒敘遍歷已經排序的元素,依次和待插入的元素進行比較,直到
 *      找到一個元素小於等於待插入元素,那麼就把待插入元素放到這個
 *      位置,其他元素向後移動一位。
 * @author lyc
 * @create 2020-04-14 15:51
 */
public class InsertionSort {

    public static void sort(Comparable[] a){
        /*
            對數組a中的元素進行排序
         */
        for (int i=1;i<a.length;i++){
            //當前元素爲a[i],依次和前面的元素比較,找到一個小於等於a[i]的元素
            for(int j=i;j>0;j--){
                if (greater(a[j-1],a[j])){
                    //交換元素
                    exch(a,j-1,j);
                }else{
                    //找到該元素,結束
                    break;
                }
            }
        }
    }


    /*
        比較v元素是否大於w元素
     */
    private static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }

    /*
        交換a數組中索引i和j處的值
     */
    private static void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}

4.希爾排序

package com.lyc.InsertionSort;

/**
 * 插入排序 ,時間複雜度O(N^2)
 * 原理:1.把所有的元素分爲兩組,已經排序的和未排序的;
 *      2.找到未排序的組中的第一個元素,向已經排序的組中進行插入;
 *      3.倒敘遍歷已經排序的元素,依次和待插入的元素進行比較,直到
 *      找到一個元素小於等於待插入元素,那麼就把待插入元素放到這個
 *      位置,其他元素向後移動一位。
 * @author lyc
 * @create 2020-04-14 15:51
 */
public class InsertionSort {

    public static void sort(Comparable[] a){
        /*
            對數組a中的元素進行排序
         */
        for (int i=1;i<a.length;i++){
            //當前元素爲a[i],依次和前面的元素比較,找到一個小於等於a[i]的元素
            for(int j=i;j>0;j--){
                if (greater(a[j-1],a[j])){
                    //交換元素
                    exch(a,j-1,j);
                }else{
                    //找到該元素,結束
                    break;
                }
            }
        }
    }


    /*
        比較v元素是否大於w元素
     */
    private static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }

    /*
        交換a數組中索引i和j處的值
     */
    private static void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}

未完待續。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章