zoukankan      html  css  js  c++  java
  • 对1000w 长度的数据排序

    采用分治思维

    import java.util.Arrays;
    import java.util.Random;
    
    public class Sort {
    
        //分片数组长度为多少时,开始排序
        public final static int SORT_NUM = 50;
    
        //数组的长度
        public final static int ARRAY_NUM = 10000000;
    
        public static void main(String[] args) {
    
            //声明数组长度
            int[] array = new int[ARRAY_NUM];
    
            //生成随机数据
            for (int j = 0; j < ARRAY_NUM; j++) {
                array[j] = new Random().nextInt(Integer.MAX_VALUE);
            }
    
            //复制数组,采用JDK自带排序
            int[] arrayCopy = new int[ARRAY_NUM];
    
            System.arraycopy(array, 0, arrayCopy, 0, ARRAY_NUM);
    
            //数据少的时候可以看看初始化结果,数据量大,ecplise直接就崩溃了。
            //System.out.println("init  :"+Arrays.toString(array));
            long time1 = System.currentTimeMillis();
            sort(array,0,array.length);
            long time2 = System.currentTimeMillis();
            //System.out.println(Arrays.toString(array));
            System.out.println(time2 - time1);
            Arrays.sort(arrayCopy);
            long time3 = System.currentTimeMillis();
            System.out.println(time3 - time2);
    
        }
    
        public static void sort(int[] array,int begin,int end){
    
            //若排序部门长度小于SORT_NUM
            if(end - begin<=SORT_NUM){
    
                //循环排序部分的元素
                for (int i = begin+1; i < end; i++) {
    
                    //查找当前元素的位置
                    int index = findIndex(array[i], begin, i - 1, array);
    
                    //获取当前元素
                    int value = array[i];
    
                    //数组移位
                    System.arraycopy(array, index, array, index + 1, i - index);
    
                    //将当前数组插入到合适的位置
                    array[index] = value;
                }
                return;
            }
    
            //作为中间轴参数使用
            int temp = array[begin];
    
            //获取当前的位置
            int currentIndex = begin;
    
            int left =begin;
            int right=end-1;
    
            while(left<right){
    
                //向右比较
                for(;left < right;right--){
                    if(left < right && array[right]<temp){
                        swap(array,currentIndex,right);
                        currentIndex = right;
                        left++;
                        break;
                    }
                }
    
                //向左比较
                for(;left < right;left++){
                    if(left < right && array[left]>temp){
                        swap(array,currentIndex,left);
                        currentIndex = left;
                        right--;
                        break;
                    }
                }
            }
    
            //左侧排序
            sort(array,begin,currentIndex+1);
            //右侧排序
            sort(array,currentIndex+1,end);
    
        }
    
    
        public static void swap(int[] array,int index1,int index2){
            int temp = array[index1];
            array[index1] = array[index2];
            array[index2] = temp;
        }
    
        //二分查找排序
        public static int findIndex(int thisval, int from, int to, int[] sortArray) {
    
            int index = 0;
    
            //当左侧数据大于当前数据,返回from的索引
            if (sortArray[from] >= thisval) {
                index = from;
                return index;
            }
    
            //当右侧数据小于当前数据,返回index后面的索引
            if (sortArray[to] <= thisval) {
                index = to + 1;
                return index;
            }
    
            if (to - from == 1) {
                return to;
            }
    
            //获取from和to的中间值
            int middle = (to - from) / 2 + from;
    
            //判断当前值在左侧还是右侧
            if (sortArray[middle] >= thisval) {
                //左侧
                return findIndex(thisval, from, middle, sortArray);
            } else {
                //右侧
                return findIndex(thisval, middle, to, sortArray);
            }
        }
    
    }
    

      

  • 相关阅读:
    Orcle 导入数据eurusd.ctl
    Maven系列2pom.xml 配置详解
    UML关联&泛化的区别
    maven 创建工程
    maven 打包
    jprofiler安装和配置
    设计模式出现之前的几大原则
    检查启动情况linux
    领域模型
    解压命令tar
  • 原文地址:https://www.cnblogs.com/baizhuang/p/13269709.html
Copyright © 2011-2022 走看看