算法设计学习9
实验目的及要求:
通过排序算法的实验,旨在深化学生对不同排序算法原理和性能的理解,培养其分析和比较算法效率的能力。通过实际编程,学生将掌握排序算法的实现方法,了解不同算法的优劣,并通过性能测试验证其在实际应用中的表现。通过这次实验,学生将深入了解排序算法的原理和性能特征,培养实际问题解决的编程能力,并提高对算法分析的理解水平。
实验设备环境:
1.微型计算机
2.DEV C++(或其他编译软件)
任务:
(1)用随机数产生 100 000 个待排序元素的关键字值
(2) 测试下列各排序函数的机器实际执行时间:
a) 直接插入排序;
b) 希尔排序;
c) 直接选择排序.
d)堆排序;
g)二路归并排序;
e)冒泡排序;
f) 快速排序;
h) 基于链式队列的基数排序。
完成 e,f 选项。
[算法思想] 程序生成了一个包含 10 个随机数的数组,然后分别对这个数组使用冒泡排序和快速排序,并测量了它们的执行时间。你可以在此基础上继续添加其他排序算法的实现和测试。请注意,排序算法的性能可能受到随机数生成的影响,因此可以多次运行程序以获得更稳定的结果。为了更好地衡量执行时间,使用了 C 标准库中的 time.h 头文件中的 clock 函数。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int* generateRandomNumbers(int n) {
int* arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; ++i) {
arr[i] = rand();
}
return arr;
}
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j <= high - 1; ++j) {
if (arr[j] <= pivot) {
++i;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
quickSort(arr, low, i);
quickSort(arr, i + 2, high);
}
}
int main() {
const int n = 8;
int* arr_bubble = generateRandomNumbers(n);
int* arr_quick = (int*)malloc(n * sizeof(int));
printf("随机生成的值:\n");
for (int i = 0; i < n; ++i) {
printf("%d ", arr_bubble[i]);
}
printf("\n\n");
for (int i = 0; i < n; ++i) {
arr_quick[i] = arr_bubble[i];
}
clock_t start_bubble = clock();
bubbleSort(arr_bubble, n);
clock_t end_bubble = clock();
double time_bubble = ((double)(end_bubble - start_bubble)) / CLOCKS_PER_SEC;
clock_t start_quick = clock();
quickSort(arr_quick, 0, n - 1);
clock_t end_quick = clock();
double time_quick = ((double)(end_quick - start_quick)) / CLOCKS_PER_SEC;
printf("\n 冒泡排序执行时间: %f 秒\n", time_bubble);
printf("快速排序执行时间: %f 秒\n", time_quick);
free(arr_bubble);
free(arr_quick);
return 0;
}