一、基本使用
在java中,數組是一種常用的數據結構,而對數組進行排序是經常會涉及到的問題。Arrays類提供了一種非常方便的方法來對數組進行排序,即sort方法。sort方法有多種重載形式,我們以最基本的形式為例:
Arrays.sort(int[] array)
這個方法接受一個int數組作為參數,並且將其進行升序排列。下面是一個簡單的排序示例:
int[] array = {5, 2, 6, 1, 3, 9, 4, 8, 7}; Arrays.sort(array); System.out.println(Arrays.toString(array));
輸出結果為:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
二、多種數據類型的排序
sort方法不僅支持int數組的排序,還支持其他多種數據類型的排序。我們來看一下各種數據類型的排序方法:
Arrays.sort(byte[] array) // 對byte數組進行排序 Arrays.sort(short[] array) // 對short數組進行排序 Arrays.sort(char[] array) // 對char數組進行排序 Arrays.sort(int[] array) // 對int數組進行排序 Arrays.sort(long[] array) // 對long數組進行排序 Arrays.sort(float[] array) // 對float數組進行排序 Arrays.sort(double[] array) // 對double數組進行排序 Arrays.sort(Object[] array) // 對Object數組進行排序
除了基本數據類型外,sort方法還支持對Object數組進行排序。需要注意的是,對於Object數組的排序,該對象必須實現了Comparable接口。
三、自定義排序方式
當默認的升序排列方式不能滿足需求時,我們可以使用自定義排序方式來對數組進行排序。在Java中,我們可以傳入一個實現了Comparator接口的對象來實現自定義排序。Comparator接口有兩個方法:compare(T o1, T o2) 和 equals(Object obj)。compare方法用於比較兩個對象的大小關係,如果第一個對象要排在第二個對象前面,則返回負數;如果兩個對象大小相等,則返回0;如果第一個對象要排在第二個對象後面,則返回正數。equals方法用於判斷兩個對象是否相等。
下面是一個自定義排序方式的示例,假設我們有一個Student類,有兩個屬性:name和score。我們按照score進行升序排列:
public class Student { private String name; private int score; // 構造函數 // get、set方法 // toString方法 // 實現比較方法 public static class ScoreComparator implements Comparator<Student> { @Override public int compare(Student o1, Student o2) { return o1.getScore() - o2.getScore(); } } } // 調用 Student[] students = new Student[3]; students[0] = new Student("張三", 90); students[1] = new Student("李四", 80); students[2] = new Student("王五", 70); Arrays.sort(students, new Student.ScoreComparator()); System.out.println(Arrays.toString(students));
輸出結果為:
[Student{name='王五', score=70}, Student{name='李四', score=80}, Student{name='張三', score=90}]
四、實現原理
不同的數據類型排序的實現方式有所不同。在這裡,我們以int數組為例,來解析Arrays中sort方法是如何完成排序的。
Arrays中sort方法的具體實現是用到了「經典」排序算法:雙軸快速排序算法。該算法的時間複雜度為O(n log n),具有非常好的排序效率。由於sort方法需要排序的數組類型非常多,這裡講解僅以一維int數組為例。
雙軸快速排序算法是快速排序算法的一種升級版本,通過多選取一個主元,將原序列劃分為三部分,小於主元、等於主元、大於主元。這樣可以在平均情況下減少一半的比較次數和交換次數。
在Arrays.sort(int[] array)方法的實現中,會先判斷數組長度是否大於47(這個常量是經過實驗得出的)。
如果大於47,則會通過雙軸快速排序算法對數組進行排序。在排序過程中,會調用Arrays中另外一個私有方法dualPivotQuicksort來實現排序。這個方法中,首先選擇兩個基準點,將排序範圍劃分為小於基準點、大於基準點和等於基準點三部分。對小於基準點和大於基準點的兩部分遞歸進行排序。當遞歸步長小於27時,會切換為插入排序算法。這樣做的原因是:插入排序算法在序列長度較小時插入操作次數少、效率高。最後,等於基準點的部分通過系統自帶的快速排序進行排序。
當數組長度小於等於47時,採用插入排序算法進行排序。數組的前兩個元素進行比較,將小的元素放到前面,大的元素放到後面。接着將第三個元素和前兩個元素進行比較,以此類推,對整個數組進行排序。
五、總結
Arrays.sort方法是Java提供的一種方便的方式,可以幫助我們對數組進行排序。具有多種形式,可以針對不同的數據類型進行排序,還支持自定義排序方式。其實現原理是使用雙軸快速排序算法或插入排序算法。
以上是針對Arrays.sort方法的基礎介紹和實現原理的學習,當然sort方法還有更多的用法需要我們去挖掘和運用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/309590.html