当然这个算法不是快排.这个算法是我在知乎上无意中看到有人说了一句"开一个很大的数组"而受到启发,经过思考和反复修改,写出了这个算法(是我独立完成的,但是之前肯定有人写过..不过我孤陋寡闻..不知道叫什么名字罢了)
这个算法只能排序元素全部是正整数的数组,虽然有局限性,但是速度非常非常非常快
排序一个长度为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亿大小的数组,只需要很短的三四秒就能排序完毕