寫在前面:都說計算機離不開對數據的排序和查找,計算機在處理任務的時候其實有80%的時間都在做查找的工作。這句話是我老師說的,具體情況是怎樣我也不知道是爲什麼,反正吧,對數據排序其實就是爲了更快的查找對吧。以前學排序算法的時候只是知道這種算法是這樣排的,每一趟排序都只能手動寫出來,一點也不直觀,上個星期閒的無聊看到有個東西叫Java FX,是用來做Java程序UI界面的,聽說比swing要好用,所以想到了用Java FX來做一個常見排序算法的過程。
先上幾張圖吧
- 冒泡排序
- 插入排序
- 快速排序
(這些gif圖是我直接用github的連接的,因爲大小超過2M了沒法上傳,如果看不了請轉到排序github項目地址)
Java FX是jdk7出來的新特性,它和swing一個最大的不同之處就是Java FX可以使用fxml來配合Scene Builder來構建界面,這個非常類似於Android使用xml佈局文件來設計界面。當然,如果你不想使用fxml,你可以直接使用代碼來動態生成界面,這個和Android也是相類似的。Java FX的相關知識可以參考Java FX中文教程,當然,如果英語好的可以直接看官方文檔,官方有Java FX的全部的API和豐富的示例,這裏就不多介紹。
主界面的這樣的
各個按鈕的功能就不用解釋了。
主類是SortApp.java,繼承了javafx.application.Application
,這裏使用的是動態構建界面這種方式。至於數據顯示,這裏動畫所使用的時間並不能代表該排序算法的真正使用時間,因爲這裏是使用這樣一個集合,它是記錄排序過程中每次數據變化之後的數據位置,然後把整個變化過程播放出來。舉個例子說,比如冒泡排序每當有前後兩個數字交換了就會記錄一次,這一次記錄就是動畫的一幀。
project中提供了一個Sort接口和一個SortAdapter類,實現Sort接口或者繼承SortAdapter都可以,當有數據的位置發生變化時,需要調用com.spareyaya.dynamicsort.util.DataUtils#add(int[])
方法來把這次數據變化記錄下來。如冒泡排序:
@Override
public void sortDesc(int[] unsortedArray) {
if (Utils.isEmpty(unsortedArray)) {
return;
}
//記錄數據變化
DataUtils.add(unsortedArray);
int tmp;
for (int i = 0; i < unsortedArray.length; i++) {
for (int j = unsortedArray.length - 1; j > i; j--){
if (unsortedArray[j] > unsortedArray[j-1]){
tmp = unsortedArray[j];
unsortedArray[j] = unsortedArray[j-1];
unsortedArray[j-1] = tmp;
//記錄數據變化
DataUtils.add(unsortedArray);
}
}
}
}
目前已經實現的有冒泡排序、快速排序、插入排序、選擇排序,其它的有興趣可以自己去實現。
該項目的地址已經上傳到github,我是github項目地址。