对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);
        }
    }

}

  

posted @ 2020-07-08 22:38  byebai95  阅读(442)  评论(0编辑  收藏  举报