一、排序
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...)}}