天天看點

Java基礎算法(1)——選擇排序Java基礎算法(1)——選擇排序

文章目錄

  • Java基礎算法(1)——選擇排序
      • 1.建立排序基類
      • 2.正題:選擇排序思路簡介
      • 3.完整代碼實作與詳細注釋
      • 4.運作效果

Java基礎算法(1)——選擇排序

1.建立排序基類

為了友善以後專心寫排序的邏輯,于是将一些經常重複使用的方法抽離出來,此處參考《算法》第四版一書。

方法簡介:

  • sort(Comparable[] a) 排序傳入的數組
  • less(Comparable v,Comparable w) 比較v,w的值,若v<w 傳回boolean類型
  • exch(Comparable[] a,int i,int j) 交換數組a中下标為i,j兩者的值
  • show(Comparable[] a) 控制台輸出此數組
  • isSorted(Comparable[] a) 判斷數組是否已經排序完成 傳回boolean類型
package Algorithm.Sort;

/**
 * 排序算法類的模闆2
 * 為了友善測試,具體排序類繼承此類即可
 *
 * 方法簡介:
 * sort(Comparable[] a) 排序傳入的數組
 * less(Comparable v,Comparable w) 比較v,w的值,若v<w 傳回boolean類型
 * exch(Comparable[] a,int i,int j) 交換數組a中下标為i,j兩者的值
 * show(Comparable[] a) 控制台輸出此數組
 * isSorted(Comparable[] a) 判斷數組是否已經排序完成 傳回boolean類型
 */
public class Template {

    public static void sort(Comparable[] a){

    }

    /**
     * 比較v,w的值,若v<=w 傳回true,否則傳回false
     * @param v
     * @param w
     * @return
     */
    public static boolean less(Comparable v,Comparable w){
        return v.compareTo(w)<=0;
    }

    /**
     * 交換數組a中下标為i,j兩者的值
     * @param a
     * @param i
     * @param j
     */
    public static void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];
        a[i]=a[j];
        a[j]=t;
    }

    /**
     * 輸出此數組
     * @param a
     */
    public static void show(Comparable[] a){
        //單行列印數組
        for (int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println();//換行
    }

    /**
     * 判斷數組是否已經排序完成
     * @param a
     * @return
     */
    public static boolean isSorted(Comparable[] a){
        //用于測試數組是否排序
        for (int i=1;i<a.length;i++){
            if(less(a[i],a[i-1])){
                return false;
            }
        }
        return true;
    }
}

           

2.正題:選擇排序思路簡介

選擇剩餘元素之中的最小值,并與目前剩餘元素的首元素交換位置

例如:3 8 4 1 2

第一次1和3交換——>1 8 4 3 2

第二次2和8交換——>1 2 4 3 8

第三次3和4交換——>1 2 3 4 8

… ——>1 2 3 4 8

… ——>1 2 3 4 8

第四次第五次應為都是剩餘元素裡面本身是最小,便和自己交換

更多實作細節在代碼中有詳細的注釋!

3.完整代碼實作與詳細注釋

package Algorithm.Sort;
/**
 * 排序(1)
 * 選擇排序
 * 找到數組中最小的元素,與第一個元素交換元素
 * 剩下的元素中再找最小的元素,與第二個交換位置,以此類推
 * (不斷選擇剩餘元素中的最小值)
 * 假設數組元素數量為:N
 * 交換總次數固定為N
 * 是以時間效率取決于元素之間比較次數
 */
public class SelectionSort extends Template {

    //升序
    public static void sort(Comparable[] a) {
        int N = a.length;
        System.out.println("排序過程:");
        for (int i = 0; i < N; i++) {
            //min為目前這次周遊中應該交換的下标(本次周遊最小元素的下标,預設為本次周遊的首元素下标)
            int min = i;
            //從目前預設最小值的下标的下一下标開始比較大小,後者小則更換min下标值
            for (int j = i + 1; j < N; j++) {
                if (less(a[j], a[min]))
                    min = j;
            }
            //本次周遊比較完所有元素後,交換下标為i和下标為min的值,使得min每次都位于剩餘元素首部
            exch(a, i, min);
            //輸出每次周遊的結果,檢視排序過程
            show(a);
        }
    }

    public static void main(String[] args) {
        String[] a = {"c", "s", "d", "n", "x", "i", "n", "g", "w", "e", "i"};
        
        System.out.println("選擇排序前");
        show(a);

        //執行選擇排序邏輯
        sort(a);

        assert isSorted(a);
        
        System.out.println("選擇排序後");
        show(a);
    }

}

           

4.運作效果

Java基礎算法(1)——選擇排序Java基礎算法(1)——選擇排序

繼續閱讀