一個非常快非常快的排序算法

當然這個算法不是快排.這個算法是我在知乎上無意中看到有人說了一句"開一個很大的數組"而受到啓發,經過思考和反覆修改,寫出了這個算法(是我獨立完成的,但是之前肯定有人寫過..不過我孤陋寡聞..不知道叫什麼名字罷了)

這個算法只能排序元素全部是正整數的數組,雖然有侷限性,但是速度非常非常非常快

排序一個長度爲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億大小的數組,只需要很短的三四秒就能排序完畢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章