當然這個算法不是快排.這個算法是我在知乎上無意中看到有人說了一句"開一個很大的數組"而受到啓發,經過思考和反覆修改,寫出了這個算法(是我獨立完成的,但是之前肯定有人寫過..不過我孤陋寡聞..不知道叫什麼名字罷了)
這個算法只能排序元素全部是正整數的數組,雖然有侷限性,但是速度非常非常非常快
排序一個長度爲1億的隨機數組(該數組的元素是1億以內的隨機正數)只需要幾秒,比歸併排序快得多
該算法的優點:針對正整數數組排序速度極快,代碼簡單易於理解
缺點:佔用的額外空間大(不過這點資源不算什麼) ;只能排序正數數組,有侷限性;
話不多說,放碼
repeatNum的每一項存儲的是該索引對應的數字在待排序數組中出現的次數,初始值爲0,每出現一次就增加1
實現類如下:
package myselfSort; import java.util.Arrays; /** * Created by 小林未鬱 on 2016/8/18. * 這個算法目前的問題在於: * 1.額外佔用空間大[原理使然..硬傷,沒辦法改] * 2.不能排序負數 */ public class fuck { protected static void sort(int[] a) {
//開一個1億的大數組以保證所有的元素都在這個大數以內 Integer[] repeatNum = new Integer[100000000]; //這個大數組索引對應的數字出現的次數默認爲0 Arrays.fill(repeatNum, 0);
//如果待排序數組a的第i個數字沒有出現過則repeatNum[a[i]]值依然爲0,若出現則自增
for (int i = 0; i < a.length; i++) { repeatNum[a[i]]++; }//按照元素的大小和每個元素重複的次數拷貝進原數組,排序完成 for (int i = 0, memory = 0; i < repeatNum.length; i++) { if (repeatNum[i] == 0) {
int frequency = repeatNum[i];
for (int i = 0, memory = 0; i < repeatNum.length; i++) { if (repeatNum[i] != 0) { int frequency = repeatNum[i]; for (; frequency > 0; frequency--, memory++) { a[memory] = i; } } } } }
測試類如下:
package myselfSort; import java.util.Random; /** * Created by 小林未鬱 on 2016/8/18. */ public class mySelfSortTestClass { public static void main(String[] args) { int[] a = new int[100000000]; Random rand = new Random(); for (int i = 0; i < a.length; i++) { a[i] = rand.nextInt(100000000); } fuck.sort(a); } }沒錯,就是這個1億大小的數組,只需要很短的三四秒就能排序完畢