天天看點

資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)

資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)

大家好,我是ChinaManor,直譯過來就是中國碼農的意思,我希望自己能成為國家複興道路的鋪路人,大資料領域的耕耘者,平凡但不甘于平庸的人。

要是資料結構那麼簡單沒人想當碼農,為了擺脫碼農還是得硬着頭皮學

資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)

目的:為了更好地學習和了解數組排序,為了面試作準備

冒泡排序:是一種計算機科學領域較常見的排序算法。

因為它的算法就如同 碳酸飲料中二氧化碳氣泡最終會上浮到頂端一樣,是以形象化稱為“冒泡排序”

原理小結:

依次“對比”或“交換”數組中每兩個相鄰的元素,

使最值元素通過交換,慢慢“浮到”數組頂端。

資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)
資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)
資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)
資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)
資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)
資料結構與算法__冒泡排序__Java外比較器和内比較器(排序專題)

課堂代碼:

/**
 * 冒泡入門-第三版
 *
 * 相鄰元素:  j  和  j+1
 * @param args
 */
public static void main(String[] args) {
    int[] arr = {55,44,11};
    System.out.println("冒泡前:"+ Arrays.toString(arr));
    for (int i = 1; i < arr.length; i++) {
        for (int j = 0; j <arr.length-i ; j++) {
            if(arr[j]>arr[j+1]){
                //交換
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
            System.out.println(Arrays.toString(arr));
        }
    }

}


/**
 * 冒泡入門-第三版
 *
 * 相鄰元素:  j  和  j+1
 * @param args
 */
public static void main(String[] args) {
    int[] arr = {55,44,11};
    System.out.println("冒泡前:"+ Arrays.toString(arr));
    for (int i = 1; i < arr.length; i++) {
        for (int j = 0; j <arr.length-i ; j++) {
            if(arr[j]>arr[j+1]){
                //交換
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
            System.out.println(Arrays.toString(arr));
        }
    }

}           

複制

升序—從小到大: arr[j]>arr[j+1]

降序—從大到小: arr[j]

如果自己寫排序,費時費力 是以下面我們介紹兩種為List集合進行排序

5.2準備資料

Person類:

public class Person {
    private String name;
    private int age;
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}           

複制

Demo1類:

public class Demo1 {
    public static void main(String[] args) {
        //1、準備資料
        ArrayList<Person> plist = new ArrayList<Person>();
        plist.add(new Person("小1",15));
        plist.add(new Person("小2",19));
        plist.add(new Person("小3",11));
        plist.add(new Person("小4",16));
        plist.add(new Person("小5",12));
    }
}           

複制

5.3Comparator比較器(外比較器)

凡是實作了Comparator接口的類,都是外比較器類。

隻要重寫接口中的compare方法,即可完成比較。

示例:

public static void main(String[] args) {
    //1、準備資料
    List<Person> plist = new ArrayList<Person>();
    plist.add(new Person("小1",15));
    plist.add(new Person("小2",19));
    plist.add(new Person("小3",11));
    plist.add(new Person("小4",16));
    plist.add(new Person("小5",12));
    //2、處理資料:通過人的年齡,比較大小。
plist.sort(new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();
    }
});

    System.out.println(plist);
}           

複制

建議:無需記憶何謂從大到小,何謂從小到大,嘗試一次即可

另一種方式:

Collections.sort(plist, new Comparator() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();
    }
});           

複制

注意:

正數、0: o1和o2位置就不會交換

負數: o1和o2位置交換

使用環境:

适用于一題多解的模式。

Person類,先進行年齡排序,後面可能還會進行成績排序,學号排序

5.4Comparable接口(内比較器)

需要Person類自己實作Comparable接口,通過Collections工具進行排序比較

Person類:

public class Person implements Comparable{
    private String name;
    private int age;
    @Override
    public int compareTo(Object o) {
        return this.getAge()-((Person)o).getAge();
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}           

複制

Demo1類:

public static void main(String[] args) {
    //1、準備資料
    List<Person> plist = new ArrayList<Person>();
    plist.add(new Person("小1",15));
    plist.add(new Person("小2",19));
    plist.add(new Person("小3",11));
    plist.add(new Person("小4",16));
    plist.add(new Person("小5",12));
    //2、處理資料
    Collections.sort(plist);
    System.out.println(plist);
}           

複制

注意:

比較器的CompareTo方法:

正數、0:不會交換

負數:交換位置

排序總結

如果一個類在不同題目中以各種方式排序,就用Comparator外比較器。

例如:Person類在題目1中用年齡排序

在題目2中用分數排序

在題目3中用生日排序

這時,一道題就要寫一個外比較器

如果一個類在不同題目中以同一種方式排序,就用Comparable内比較器

例如:Person類在題目1、題目2、題目3中 都是用年齡排序,這時,就可以統一在Person類中寫一個内比較器

一個類在不同題目中,經常是要不同方式排序, 外比較器使用頻率最高           

複制