學習二分法查詢的時候為了排序簡單寫了個氣泡排序,當資料量到達10w級的時候,效率真是低到沒朋友了!
所以想實現個效率高些的排序,想到了快速排序!快速排序的思維是對半拆分,在乙個陣列中選取乙個臨界值,
如果小於這個臨界值就將該數值前移,形成了初步排序的左右兩邊,之後遞迴左右兩邊即可!
於是寫了乙個如下排序:
private static void quicksort(int arr, int start, int end)
int base = arr[start];
int in = start;
for (int i = start + 1; i < end; i++)
}quicksort(arr, start, in - 1);
quicksort(arr, in + 1, end);
}
試執行排序了乙個小陣列,發現成功了,不過多幾個數值之後就發現了問題:
我取的第乙個元素的值為標桿,排序過程中如果一直出現後面的數值小於標桿值,那麼不會出現問題,
但是如果連續有幾個數值大於標桿值,這幾個值就會放在原位置不動,直到後面有小於標桿值的數值來替換。
這個問題想來可以通過交換『標桿值』和『第一次排完順序的陣列中的第乙個大於標桿值的元素』的位置來解決,
但是這個標桿值在排序過程中被移動到**去了卻無從所知。所以,還是修改**吧!將標桿值最先一直留
在檔次排序的第一位,排序結束之後,交換標桿值和最後乙個小於標桿值的元素。於是優化為如下**:
private static void quicksort(int arr, int start, int end)
int base = arr[start];
int in = start; int temp; for (int i = start + 1; i < end; i++)
}// 此處無需新增判斷條件,直接執行即可,因為in處值一定小於首位置base
arr[start] = arr[in];
arr[in] = base;
quicksort(arr, start, in);
quicksort(arr, in + 1, end);
} 兩個排序的比較資料: sort(arr); //冒泡 10000 - 300ms 100000 - 23s
quicksort(arr, 0, arr.length); // 10000 - 3ms // 100000 - 35ms
當資料量很大的時候,氣泡排序已經無法使用! 注:建議自己按照排序演算法的思維編寫一下,慢慢優化就會發現最優寫法! 附上各種排序的複雜度分析,雖然有些我也沒玩兒過!
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
排序演算法 快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...