📅  最后修改于: 2023-12-03 15:36:35.611000             🧑  作者: Mango
本程序演示了如何使用Gnuplot库在C程序中绘制气泡排序、插入排序和选择排序的时间复杂度图。
本程序需要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,请先安装该软件。
下面是程序输出的时间复杂度图: