编写一个程序解决选择问题。令K=N/2,画出表格显示程序对N中不同值的运行时间

public class Question1 {


    public static void main(String[] args) {
        int size = 10000;
        int[] array = createArray(size);
        System.out.println(Arrays.toString(array));
        int max = getMaxByIndex(array,size/2);
        System.out.println(max);
    }




    public static int getMaxByIndex(int[] array , int index){
        long startTime = new Date().getTime();
        int[] dataArray = new int[index];//用于保存 最小到第k大的数组,简称缓冲数组。
        int dataArrayMax ;//接受缓存数组中最大的数

        for (int i = 0; i < array.length ; i++) {
            int temp = array[i];
            if(i == 0){//模仿插入排序,保证其中新数组中必定含有1个元素
                dataArray[i] = temp;
                continue;
            }
            if(i < index){//在缓冲数组被填充满之前,先进行数据填充,并且在每次填充时,排好顺序
                dataArray[i] = temp;
                for(int j = i ;j>0 && dataArray[j]<dataArray[j-1];j--){
                    int tmp = dataArray[j];
                    dataArray[j]= dataArray[j-1];
                    dataArray[j-1] = tmp;
                }
                continue;
            }else {//此时,缓冲数组中已被填充满,每次遍历到新数据时,进行判断
                dataArrayMax = dataArray[index-1];
                //比缓存数组中的最大值大,就舍弃
                if (temp >=dataArrayMax){
                    continue;
                }else{
                    //遍历缓冲数组,找到当前数值需要插入的位置
                    for (int j = 0; j < index; j++) {
                        int number = dataArray[j];
                        if(number>=temp){
                            //找到了新数字需要插入的下标,此时将该下标后的所有数字向后移
                            for (int k = index-2;k>=j;k--){
                                int currentNumber = dataArray[k];
                                dataArray[k+1] = currentNumber;
                            }
                            dataArray[j] = temp;
                            break;
                        }
                    }
                }

            }

        }
        long endTime = new Date().getTime();
        System.out.println("耗时:"+(endTime-startTime)+"ms");
        System.out.println(Arrays.toString(dataArray));
        return dataArray[index-1];
    }

    /**
     * 交换数字位置,用于简化插入排序算法
     * @param array
     * @param x
     * @param y
     */
    public static  void swap(int[] array,int x,int y){
        int temp = array[x];
        array[x] = array[y];
        array[y] = temp;
    }




    /**
     * 根据数组长度生成新的数组
     * @param size 数组长度
     */
    public static int[] createArray(int size){
        int[]  array = new int[size];
        for (int i = 0 ;i<size ;i++){
            int random = new Random().nextInt(10);
            array[i] = random;
        }
        return  array;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值