/**
* 排序過程
* 1,找一個基準數,找數組內的任意一個數都行,一般都是以數組第一個數爲基準數
* 2,從數組末位向前循環找比基準數小的,找到了先停下,也就是記錄當前的索引
* 從數組開端向後循環找比基準數大的,找到了先停下,也就是記錄當前的索引
* 3,將第二步的兩個索引的位置的數值交換,這樣比基準數大的就到了基準數的後面, 比基準數小的就到了基準數的前面
* 4,繼續不停的重複2,3步,直到兩個索引位置相等,就不用再交換了,也就是當start < end時就不停止循環
* 5,start和end相等,停止循環,將start或end位置的數與基準數交換
* 6,遞歸循環基準數左面的數組
* 7,遞歸循環基準數右面的數組
* @param arr
* @param start
* @param end
*
* 幾個問題,(把索引start和end當成指針來講)
* start和end一定會相遇嗎,或者說start和end一定會相等嗎?
* 答:一定會的,因爲start和end都是一步一步移動的,移動會發生重合
* start和end相遇或者說重合或者說索引位置一樣,該位置的數一定是比基準數小的嗎?(該位置的數要和基準是交換)
* 答:因爲是end先移動的,end指向的都是比比基準數小的數(start和end交換時)
* 1當end發現比基準數小的數,start發現比基準數大的數,進行交換數據時,一定是成對出現的
* 2當end往前移動與start相遇時,這個時候start和end已經交換了數據,start指向的就是比基準數小的數,
* 3當start向後移動,end已經指向的是比基準數小的數,
* 4綜上;當相遇時start和end位置上的數一定是比基準數小的數,所以可以和首位置上的基準數交換
* 5出現“相遇時start和end位置上的數一定是比基準數小的數”這種情況是移動的先後順序引起的,如果是start
* 先移動,則相遇時最後指向的是比基準數大的數。
*/
public static void fastSort(int[] arr,int start,int end){
if(null == arr || arr.length == 0 || start >= end)
return;
//將start 和 end記錄下來,是爲了進行左側和右側兩段的排序
int left = start;
int right = end;
int key = arr[start];
while (start < end){
//從後往前循環,如果不是先從後往前循環,那麼排序結果是不正確的,爲什麼?
while (start < end && arr[end] >= key) end--;
//從前往後循環
while (start < end && arr[start] <= key) start++;
if(start < end) swap(arr,start,end);
}
//將基準數和start與end相等的位置的數交換位置,left位置就是最開端的數,是基準數
//這個時候start和end是相等的,這裏用end也可以
swap(arr,left,start);
//基準數左側數組的排序
fastSort(arr,left,start-1);
//右側的排序
fastSort(arr,start+1,right);
}
Hello World
輸出:6,7,9,30,34,34,42,48,49,83,84,89,93,98,223,321,845,
public static void swap(int[] arr,int index1,int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
public static void main(String args[]){
System.out.println("Hello World");
int[] arr = {30,6,89,83,42,9,34,84,98,93,845,321,34,7,223,48,49};
fastSort(arr,0,arr.length-1);
// swap(arr,0,2);
printArr(arr);
}
private static void printArr(int[] arr) {
StringBuilder stringBuilder = new StringBuilder();
for (int i : arr) {
stringBuilder.append(i).append(",");
}
System.out.println(stringBuilder.toString());
}