JAVA快速排序——亿级体量数据

来源:互联网 发布:中美贸易顺差数据 编辑:程序博客网 时间:2024/04/26 18:11

算法真的是太强大了,今天测试了给一亿个随机数据进行排序,花了67秒不到!不多说,直接见代码:



  import java.util.Random;



public class sort {
   


    public static void main(String[] args) {
        
       
        int[] datas = new int[100000000];
        long t1 = System.currentTimeMillis();
        initData(datas);
        long t2 = System.currentTimeMillis();
        long t3 = t2 - t1;
        System.out.println("初始化数据所用时间"+t3);
        
        long starttime = System.currentTimeMillis();
     
        quickSort(datas,0,datas.length - 1);
        long endtime = System.currentTimeMillis();
        
        long time = endtime - starttime;
        System.out.println(time+"毫秒");
    }
   
    public static void initData(int [] datas){
       
        for (int i = 0; i < datas.length; i++) {
            datas[i] = (int) (Math.random() * 100000);
        }
        
    }
  
    /**
     * 
     * @param datas
     *            数据
     * @param left
     *            数据的起始位置
     * @param right
     *            数据的结束位置
     */
    public static void quickSort(int[] datas, int left, int right) {
        // 跳出递归的条件,交叉
        if (left >= right) {
            return;
        }
        // 否则,快速排序
        int middle = findMiddle(datas, left, right);
        // 每一半按同样的方式排序
        // 左半
        quickSort(datas, left, middle - 1);
        // 右半
        quickSort(datas, middle + 1, right);


    }


    /**
     * 找数据的中间位置
     * 
     * @param datas
     * @param left
     * @param right
     * @return
     */
    private static int findMiddle(int[] datas, int left, int right) {
        int middle = -1;// 中间位置
        // 以最后一个数据做参照物
        int temp = datas[right];
        // 定义左右两个指针开始查找数据
        int leftIndex = left;
        int rightIndex = right - 1;


        while (true) {
            // 1. 左指针从左往右依次找比temp大的数据
            while (leftIndex < right && datas[leftIndex] <= temp)
                leftIndex++;
            // 注意: 跳转循环的条件有两个: 1,leftIndex == right 2. datas[leftIndex] > temp
            // 如果通过 1,leftIndex == right 跳出循环,说明参照物是最大值
            if (leftIndex == right) {
                middle = leftIndex;
                break;
            }


            // 2. 右指针从右往左依次找temp小的数据
            while (rightIndex >= left && datas[rightIndex] >= temp)
                rightIndex--;
            // 注意: 跳转循环的条件有两个: 1,rightIndex < left 2. datas[leftIndex] < temp
            //如果  1,rightIndex < left 跳出循环,说明参照物是最小值,
            //也是交叉,按下面代码一起处理
            
            // 比较左右指针是否出现交叉
            if (leftIndex < rightIndex) {
                // 没有交叉
                // 交换左右指针位置上的数据
                change(datas, leftIndex, rightIndex);
                // 继续循环
                continue;
            } else {
                // 交叉
                // 交换左指针和参照物的值
                change(datas, leftIndex, right);
                // 找到中间点(leftIndex)终止整个循环
                middle = leftIndex;
                break;
            }


        }
        return middle;
    }
    
    private static void change(int[] datas, int left, int right) {
        int temp = datas[left];
        datas[left] = datas[right];
        datas[right] = temp;
    }
    
}
  

  如果你看到了,下方评论告诉下我的你所用的时间,thinks!



1 0
原创粉丝点击