【算法】排序(插曲)快慢排序效率

正文之前

寫了好幾篇排序算法的文章,剛好碰上課程作業,需要比較一種慢排序和一種快排序的效率,所以《排序》系列文章中間就安排了這個小插曲,本文選取的排序方式為選擇排序歸并排序


正文

選擇排序歸并排序是這次任務所選的兩種排序方式

本文將介紹以下內容:

  1. 計算運行時間
  2. 比較二者運行時間
  3. 根據運行時間作圖

筆者所使用的書籍為《算法(第四版)》,所以有涉及到書籍中的API(StdRandom, Stopwatch, StdDraw)

1. 計算運行時間

歸并排序
public static double timeTrial1(int N){
        int [] a = new int [N];
        for (int i = 0; i < N; i++) {
            a[i] = StdRandom.uniform(N);
        }
        Stopwatch timer = new Stopwatch();
        MergeSort.sort(a);
        return timer.elapsedTime();
    }

創建Stopwatch對象時開始及時,elapsedTime()方法返回自從創建對象到返回值之間所經過的時間(也就是排序運行的時間),單位為 s(秒)

選擇排序
public static double timeTrial2(int N){
        double[] a = new double[N];
        for (int i = 0; i < N; i++) {
            a[i] = StdRandom.uniform(N);
        }
        Stopwatch timer = new Stopwatch();
        SelectionSort.sort(a);
        return timer.elapsedTime();
    }

采用的方法和上述相同

2. 比較二者運行時間

寫一個測試數據(數據大小從200到204800),得出運行時間:

為了表示歸并排序究竟比選擇排序快多少,在for循環中加一行代碼:

System.out.printf("\t\tMergeSort is %f times faster than SelectionSort\n",time2/time1);

數據量越大,就越能體現出差別

3. 根據運行時間作圖

使用《算法》的API來進行作圖

public static void Draw(){
        //set the size of canvas and set the Xscale and Yscale
        StdDraw.setCanvasSize(800,800);
        StdDraw.setXscale(0,13);
        StdDraw.setYscale(0,20);

        //draw the line as the Xscale and Yscale
        StdDraw.line(1,3,12.5,3);       //Xscale
        StdDraw.line(1,3,1,18.5);         //Yscale

        //set the radius of the points
        StdDraw.setPenRadius(0.01);

        //tell the difference about two kinds of points of the two Sort method
        StdDraw.text(2,19.5,"MergeSort");
        StdDraw.text(2,19,"SelectSort");
        StdDraw.setPenColor(Color.RED);
        StdDraw.point(3,19.5);
        StdDraw.setPenColor(Color.BLUE);
        StdDraw.point(3,19);

        //set the x_coordinate
        for (int i = 2, n = 200; i <= 12 ; n += n, i += 1) {
            StdDraw.text(1,2,String.valueOf(0));
            StdDraw.text(i,2,String.valueOf(n),45);
        }

        //set the y_coordinate
        for (int i = 4, n = 1; i < 19; n += 1,i++) {
            StdDraw.text(0.5,3,String.valueOf(0));
            StdDraw.text(0.5,i,String.valueOf(n/1.0));
        }

        //draw the points of the running time of MergeSort
        for (int N = 200, j = 1; N <= 204800; N += N, j++){
            StdDraw.setPenColor(Color.RED);
            Double time1 = timeTrial1(N);
            StdDraw.point(j+1, time1 + 3);
        }

        //draw the points of the running time of SelectSort
        for (int N = 200, j = 1; N <= 204800; N += N, j++){
            StdDraw.setPenColor(Color.BLUE);
            Double time2 = timeTrial2(N);
             StdDraw.point(j+1, time2 + 3);
        }
    }

會計算排序運行時間,并根據結果作圖:

由此,排序的比較就暫且告一段落了,謝謝!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一. 寫在前面 要學習算法,“排序”是一個回避不了的重要話題,在分析完并查集算法和常用數據結構之后,今天我們終于可...
    Leesper閱讀 2,554評論 0 40
  • 排序的基本概念 在計算機程序開發過程中,經常需要一組數據元素(或記錄)按某個關鍵字進行排序,排序完成的序列可用于快...
    Jack921閱讀 1,460評論 1 4
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,746評論 0 15
  • 昨晚上妹妹打電話來說,上高一的侄女收到了男生的情書。她焦慮得不行,發給她之前在網上看到的一個媽媽的做法。(和父母有...
    Q心理閱讀 589評論 0 2
  • 今天收到好多信息,感覺很‘負面’.面對現實中的問題,真有好多次找人吐槽的愿望,既然想吐槽又想理一理,那就坐下看看...
    刺猬的告白閱讀 735評論 0 0