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

当然这个算法不是快排.这个算法是我在知乎上无意中看到有人说了一句"开一个很大的数组"而受到启发,经过思考和反复修改,写出了这个算法(是我独立完成的,但是之前肯定有人写过..不过我孤陋寡闻..不知道叫什么名字罢了)

这个算法只能排序元素全部是正整数的数组,虽然有局限性,但是速度非常非常非常快

排序一个长度为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亿大小的数组,只需要很短的三四秒就能排序完毕

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值