• 第一章课后习题1.1


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

    package com.algorithm.chapterone;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Comparator;
    import java.util.Random;
    
    import org.junit.Test;
    
    import sun.tools.jar.resources.jar;
    
    /**
     * 编写一个程序解决选择问题。令k=N/2
     * @author Gao·Rongzheng
     *
     */
    public class QuestionOne {
        public int[] numbers;
        
        /**
         * 生成范围从1到endNumber的随机数size个,并将其赋值给numbers
         * @param endNumber
         * @param size
         */
        public void creatArray(int endNumber, int size) {
            int[] numberArray = new int[size];
            Random random = new Random();
            
            for (int i=0; i<size; i++) {
                numberArray[i] = random.nextInt(endNumber) + 1;
            }
            
            numbers = numberArray;
        }
        
        /**
         * 冒泡排序算法
         */
        public void sortNumbersOne() {
            long startTime = System.currentTimeMillis();
            for (int m=1; m<numbers.length; m++) {
                for (int n=numbers.length-1; n>m-1; n--) {
                    if (numbers[n] > numbers[n-1]) {
                        int temp = numbers[n];
                        numbers[n] = numbers[n-1];
                        numbers[n-1] = temp;
                    }
                }
            }
            int k = 0;
            if (numbers.length%2 == 0) {
                k = numbers.length / 2 -1;
            } else {
                k = numbers.length / 2;
            }
            long endTime = System.currentTimeMillis();
            System.out.println("数组中第N/2个最大者: " + (numbers[k]));
            System.out.println("本次算法运行时间为: " + (endTime - startTime) + "ms");
        }
        
        /**
         * 把数组中的前N/2个数放进一个数组,后面的数放进另外一个数组,然后把第一个数组进行排序,依次读出后一个数组的数,把它和第一个数组的第一个数进行比较,符合条件的放入第一个数组把它移动到正确的位置,最后第一个数组的最后一个就是正确答案
         */
        public void sortNumbersTwo() {
            long startTime = System.currentTimeMillis();
            int k = 0;
            if (numbers.length%2 == 0) {
                k = numbers.length / 2 -1;
            } else {
                k = numbers.length / 2;
            }
            
            //※把前k个数放入一个数组,后面的数放入另外一个数组
            int[] result = new int[k+1];
            int[] comparator = new int[numbers.length - k -1];
            for (int i=0; i<numbers.length; i++) {
                if (i <= k) {
                    result[i] = numbers[i];
                } else {
                    comparator[i-k-1] = numbers[i];
                }
            }
            
            //※对结果数组进行从大到小的冒泡排序
            for (int m=1; m<result.length; m++) {
                for (int n=result.length-1; n>m-1; n--) {
                    if (result[n] > result[n-1]) {
                        int temp = result[n];
                        result[n] = result[n-1];
                        result[n-1] = temp;
                    }
                }
            }
            
            for (int j=0; j<comparator.length; j++) {
                int compareNumber = comparator[j];
                if (compareNumber > result[k]) {
                    result[k] = compareNumber;
                    for (int x=k; x>0; x--) {
                        if (result[x] > result[x-1]) {
                            int temp = result[x];
                            result[x] = result[x-1];
                            result[x-1] = temp;
                        } else {
                            break;
                        }
                    }
                }
            }
            long endTime = System.currentTimeMillis();
            System.out.println("数组中第N/2个最大者: " + result[k]);
            System.out.println("本次算法运行时间为:  " + (endTime - startTime) + "ms");
        }
        
        @Test
        public void testSort() throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("输入数组最大值");
            int endNumber = Integer.valueOf(br.readLine());
            System.out.println("输入数组长度");
            int size = Integer.valueOf(br.readLine());
            creatArray(endNumber, size);
            br.close();
            sortNumbersTwo();
        }
    }
  • 相关阅读:
    java常用类
    java throw和catch同时使用
    HTML5 input 类型: email及url
    Android中集成支付宝
    HTML5 预加载
    SQLite数据库
    Android开发中如何加载API源码帮助开发
    Java中的static
    HTML5 Web Storage 特性
    gdal1.10编译经验
  • 原文地址:https://www.cnblogs.com/code-future/p/11418596.html
Copyright © 2020-2023  润新知