【Java语言程序设计(基础篇)第10版 练习题答案】Practice_9_6

时间:2022-03-26 23:33:15

(秒表)设计一个名为 StopWatch 的类,该类包含:

  • 具有访问器的私有数据域 startTime 和 endTime。
  • 一个无参构造方法,使用当前时间来初始化 startTime。
  • 一个名为 start() 的方法,将 startTime 重设为当前时间。
  • 一个名为 stop() 的方法,将 endTime 设置为当前时间。
  • 一个名为 getElapsedTime() 的方法,以毫秒为单位返回秒表记录的流逝时间。
    画出该类的 UML 图并实现这个类。编写一个测试程序,用于测量使用选择排序对 100 000 个数字进行排序的执行时间。
import java.util.Date;
import java.util.Random;

public class Practice_9_6 {

    public static void main(String[] args) {

        final int NUM = 100000;

        int[] number = new int[NUM];
        Random random = new Random();

        for (int i = 0; i < NUM; i++)
            number[i] = random.nextInt(100000);

        StopWatch stopWatch = new StopWatch();
        sort(number, 0, NUM - 1);
        stopWatch.stop();

        System.out.println(stopWatch.getElapsedTime() + "ms");

    }

    //将数组第一个数作为中间数,放到数组中正确的位置,并返回其位置
    public static int mid(int[] a,int low,int high) {
        int middle = a[low];

        while (low < high) {
            for (; low < high; high--) {
                if (middle > a[high]) {
                    a[low] = a[high];
                    low++;
                    break;
                }
            }

            for (; low < high; low++) {
                if (a[low] > middle) {
                    a[high] = a[low];
                    high--;
                    break;
                }
            } 
        }

        a[low] = middle;

        return low;
    }

    //将数组分成两份。递归。
    public static void sort(int[] a, int low, int high) {

        if (low >= high)
            return;

        int middle;

        middle = mid(a, low, high);

        sort(a, low, middle - 1);
        sort(a, middle + 1, high);

    }

}

class StopWatch {

    private Date startTime;
    private Date endTime;

    public StopWatch() {
        startTime = new Date();
    }

    public void start() {
        startTime = new Date();
    }

    public void stop() {
        endTime = new Date();
    }

    public long getElapsedTime() {
        return endTime.getTime() - startTime.getTime();
    }

    public Date getStartTime() {
        return startTime;
    }

    public Date getEndTime() {
        return endTime;
    }

}

输出结果为:

21ms

(输出结果不一定是一样的,根据数组的杂乱程度和电脑性能而定)
(程序若有问题或者建议希望在评论处提,因为我是个初学者,想有所提高)