📜  使用Gnuplot进行气泡,插入和选择排序的时间复杂度图的C程序(1)

📅  最后修改于: 2023-12-03 15:36:35.611000             🧑  作者: Mango

使用Gnuplot进行气泡、插入和选择排序的时间复杂度图的C程序

本程序演示了如何使用Gnuplot库在C程序中绘制气泡排序、插入排序和选择排序的时间复杂度图。

依赖库

本程序需要Gnuplot库支持。

程序流程
  1. 随机生成待排序的数组;
  2. 分别使用气泡排序、插入排序和选择排序对数组进行排序,并记录排序所需的时间;
  3. 使用Gnuplot库将时间复杂度图绘制出来。
代码实现

下面是完整的C程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "gnuplot_i.h"

#define MAX_SIZE 3000

void bubble_sort(int arr[], int n)
{
    int i, j;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}

void insertion_sort(int arr[], int n)
{
    int i, j, tmp;
    for (i = 1; i < n; i++) {
        tmp = arr[i];
        for (j = i; j > 0 && arr[j - 1] > tmp; j--)
            arr[j] = arr[j - 1];
        arr[j] = tmp;
    }
}

void selection_sort(int arr[], int n)
{
    int i, j;
    for (i = 0; i < n - 1; i++) {
        int min_idx = i;
        for (j = i + 1; j < n; j++)
            if (arr[j] < arr[min_idx])
                min_idx = j;
        int tmp = arr[i];
        arr[i] = arr[min_idx];
        arr[min_idx] = tmp;
    }
}

void generate_random_array(int arr[], int n)
{
    srand(time(NULL));
    int i;
    for (i = 0; i < n; i++)
        arr[i] = rand();
}

double sort_and_calc_time(int arr[], int n, void (*sort)(int[], int))
{
    clock_t start, end;
    start = clock();
    sort(arr, n);
    end = clock();
    return (double)(end - start) / CLOCKS_PER_SEC;
}

void plot_time_complexity()
{
    Gnuplot *gp = gnuplot_init();
    gnuplot_set_xlabel(gp, "Array Size");
    gnuplot_set_ylabel(gp, "Execution Time (s)");
    gnuplot_cmd(gp, "set title 'Sorting Algorithms Time Complexity'");
    gnuplot_cmd(gp, "set grid");

    int arr[MAX_SIZE];
    int n, i;
    double dur;

    for (n = 10; n <= MAX_SIZE; n += 10) {
        generate_random_array(arr, n);
        dur = sort_and_calc_time(arr, n, bubble_sort);
        printf("Bubble Sort: %d %f\n", n, dur);
        gnuplot_cmdf(gp, "plot '-' using 1:2 with lines title 'Bubble Sort'");
        gnuplot_cmdf(gp, "%d %f\n", n, dur);
        gnuplot_cmd(gp, "e");
    }

    for (n = 10; n <= MAX_SIZE; n += 10) {
        generate_random_array(arr, n);
        dur = sort_and_calc_time(arr, n, insertion_sort);
        printf("Insertion Sort: %d %f\n", n, dur);
        gnuplot_cmdf(gp, "plot '-' using 1:2 with lines title 'Insertion Sort'");
        gnuplot_cmdf(gp, "%d %f\n", n, dur);
        gnuplot_cmd(gp, "e");
    }

    for (n = 10; n <= MAX_SIZE; n += 10) {
        generate_random_array(arr, n);
        dur = sort_and_calc_time(arr, n, selection_sort);
        printf("Selection Sort: %d %f\n", n, dur);
        gnuplot_cmdf(gp, "plot '-' using 1:2 with lines title 'Selection Sort'");
        gnuplot_cmdf(gp, "%d %f\n", n, dur);
        gnuplot_cmd(gp, "e");
    }

    gnuplot_close(gp);
}

int main()
{
    plot_time_complexity();
    return 0;
}

程序主要包括三个排序算法的实现和时间复杂度图的绘制。在绘制图表的过程中,我们分别计算了每个算法在不同数组大小下所用的时间,并通过Gnuplot库在图表中绘制出来。

使用方法

编译并运行程序:

gcc -o sort sort.c -lm -lgnuplot_i
./sort

程序执行后,将输出排序所用的时间,并在Gnuplot软件中绘制相应的时间复杂度图。如果没有安装Gnuplot,请先安装该软件。

绘图效果

下面是程序输出的时间复杂度图:

Sorting Algorithms Time Complexity

参考资料
  • Gnuplot官方文档:http://www.gnuplot.info/docs_5.0/gnuplot.pdf