資料結構與演算法----# 一、排序

有點小白的菜鳥發表於2022-03-16

一、排序

1、比較器Comparable

Java中的比較器(排序) - 情陌人灬已不在 - 部落格園 (cnblogs.com)

Comparable和Comparator介面都是為了對類進行比較,眾所周知,諸如Integer,double等基本資料型別,java可以對他們進行比較,而對於類的比較,需要人工定義比較用到的欄位比較邏輯。可以把Comparable理解為內部比較器,而Comparator是外部比較器。

實體類student:

public class Student implements Comparable<Student> {
    private String name;
    private int age;
	//有參、無參、get、set、tostring
    @Override
    public int compareTo(Student o) {
        return this.age-o.age;
    }
}

測試類:

public class TestCompare {
    public static void main(String[] args) {
        Student s1 = new Student("馬雲", 40);
        Student s2 = new Student("馬化騰", 41);
        Comparable max = getMax(s1, s2);
        System.out.println(max);
    }
    public static Comparable getMax(Comparable c1, Comparable c2){
        int res=c1.compareTo(c2);
        if (res>=0){
            return c1;
        }else {
            return c2;
        }
    }
}

2、氣泡排序

氣泡排序優缺點

  • 優點:比較簡單,空間複雜度較低,是穩定的
  • 缺點:時間複雜度太高,效率較低

java程式碼:

/*
    氣泡排序演算法:由小到大  分為三個方法較之前更加 封裝解耦
    最壞時間複雜度:逆序情況下O(n^2)
    適用場景:元素較少的情況下可選擇適用
    優點:安全穩定排序,比較兩個相同的資料時順序不變
* */
public class BubbleSort {

    /*
    * 對陣列a中的元素排序 Integer 型別 implements Comparable<Integer>,因此可以採用比較器
    * */
    public static void bubbleSort(Integer[] 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);
            }
            //System.out.println("第"+(i+1)+"趟:"+ Arrays.toString(a)); //測試每趟下來的結果
        }
    }

    /*
    陣列元素i和j交換位置方法
    * */
    public static void exch(Comparable[] a,int i,int j){
        Comparable temp;
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }

    /*
     * 比較a,b兩個元素的大小方法
     * */
    public static boolean greater(Comparable a,Comparable b){
        return a.compareTo(b)>0;
    }
}

測試類:

public class BubbleSortTest {
    public static void main(String[] args) {
        Integer[] arr= new Integer[]{3, 5, 1, 4, 2};
        bubbleSort(arr);                          //給陣列排序
        System.out.println(Arrays.toString(arr));
    }
}

3、選擇排序

java程式碼:

/*
*   選擇排序演算法:升序 分為三個方法較之前更加 封裝解耦
    時間複雜度:O(n^2)
    適用場景:元素較少的情況下可選擇適用
    優點:不穩定排序,比較兩個相同的資料時順序可能發生改變
* */
public class SelectSort {

    public static void Sort(Integer[] arr){
                                                //最小元素下標
        int minIndex;                           
        for (int i=0;i<arr.length-1;i++){       //進行N次交換
            minIndex=i;                         //預設最小元素下標為i
            for (int j=i+1;j< arr.length;j++){  //從i+1比較到最後一個元素
                if (greater(arr[minIndex],arr[j])){
                    minIndex=j;                 //被較小元素下標替換
                }
            }
            exch(arr,i,minIndex);               //交換i與最小元素
        }
    }

    /*
        陣列元素i和j交換位置方法
        * */
    public static void exch(Comparable[] a,int i,int j){
        Comparable temp;
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }

    /*
     * 比較a,b兩個元素的大小方法
     * */
    public static boolean greater(Comparable a,Comparable b){
        return a.compareTo(b)>0;
    }

}

測試類:

public class SelectTest {

    public static void main(String[] args) {
        Integer[] arr=new Integer[]{4,3,5,6,1,2};
        Sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

選擇與冒泡比較:

{{uploading-image-136746.png(uploading...)}}

相關文章