グラフの例:実行時間の比較では選択ソートとクイックソートの実行時間を比較する図をRで描いた。ここでは新しいM1 Mac miniで計測し直してPythonでプロットしてみる。
まずは計測するプログラム:
#include <stdio.h> #include <stdlib.h> #include <time.h> void selectsort(int n, double a[]) { int i, j, k; double min; for (i = 0; i < n - 1; i++) { min = a[i]; k = i; for (j = i + 1; j < n; j++) { if (a[j] < min) { min = a[j]; k = j; } } a[k] = a[i]; a[i] = min; } } void quicksort(double a[], int first, int last) { int i, j; double x, t; x = a[(first + last) / 2]; i = first; j = last; for ( ; ; ) { while (a[i] < x) i++; while (x < a[j]) j--; if (i >= j) break; t = a[i]; a[i] = a[j]; a[j] = t; i++; j--; } if (first < i - 1) quicksort(a, first, i - 1); if (j + 1 < last) quicksort(a, j + 1, last); } #define N 200000 double a[N]; int main(void) { int i, n; double t1, t2; printf("n,selectsort,quicksort\n"); printf("0,0,0\n"); srand(time(NULL)); for (n = N / 10; n <= N; n += N / 10) { for (i = 0; i < n; i++) { a[i] = rand() / (RAND_MAX + 1.0); } t1 = clock(); selectsort(n, a); t1 = (clock() - t1) / CLOCKS_PER_SEC; for (i = 0; i < n; i++) { a[i] = rand() / (RAND_MAX + 1.0); } t2 = clock(); quicksort(a, 0, n - 1); t2 = (clock() - t2) / CLOCKS_PER_SEC; printf("%d,%g,%g\n", n, t1, t2); } return 0; }
これをMac mini (M1, 2020) メモリ16GB,macOS Monterey 12.0.1のClangでコンパイルし,実行する:
gcc sorttest.c ./a.out >sorttest.csv
次のようなCSVファイルが得られた:
n,selectsort,quicksort 0,0,0 20000,0.458851,0.002114 40000,1.67997,0.00456 60000,3.7764,0.006821 80000,6.70887,0.009313 100000,10.4805,0.011746 120000,15.0893,0.014356 140000,20.5392,0.016822 160000,26.8221,0.019735 180000,33.9387,0.022544 200000,41.8947,0.025369
これを次のPythonコードでグラフにする:
import matplotlib.pyplot as plt import numpy as np import pandas as pd df = pd.read_csv("sorttest.csv") for i in ["selectsort", "quicksort"]: plt.plot(df["n"], df[i], "o", label=i) plt.legend() n = df["n"].values[-1] x = np.linspace(0, n, 101)[1:] a = df["selectsort"].values[-1] / n ** 2 plt.plot(x, a * x ** 2, color="C0") b = df["quicksort"].values[-1] / (n * np.log(n)) plt.plot(x, b * x * np.log(x), color="C1") plt.xlabel("N") plt.ylabel("time (seconds)") plt.savefig("sort-lin.svg", bbox_inches="tight") plt.yscale("log") plt.savefig("sort-log.svg", bbox_inches="tight")
Last modified: