设计两组数据,一组最坏情况,一种一般情况,用快速排序法从大到小排序,数据规模为10000,记录实际运行时间,同时分别记录两种情况运行次数。C语言完整代码
时间: 2024-09-12 16:16:38 浏览: 37
行业资料-交通装置-一种带两组或者多组光源的电动车前照灯.zip
要实现这个需求,我们需要编写一个C语言程序,该程序能够生成两组不同的数据集:一组是“最坏情况”的数据(通常是已经有序或接近有序的数据),另一组是“一般情况”的数据(随机分布的数据)。然后,我们将使用快速排序算法对这两组数据进行排序,并记录下排序所需的时间以及排序过程中的比较次数。
以下是使用快速排序算法进行排序的C语言示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 快速排序的分区函数
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为基准
int i = (low - 1); // 比基准小的元素的索引
for (int j = low; j <= high - 1; j++) {
// 如果当前元素大于或等于基准
if (arr[j] >= pivot) {
i++; // 增加小于基准的元素的索引
// 交换 arr[i] 和 arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 交换 arr[i+1] 和 arr[high](或基准)
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
// 快速排序函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
// pi 是分区索引,arr[pi] 现在在正确的位置
int pi = partition(arr, low, high);
// 分别对分区前后的元素进行递归排序
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// 生成最坏情况数据集
void generateWorstCaseData(int arr[], int size) {
for (int i = 0; i < size; i++) {
arr[i] = size - i;
}
}
// 生成一般情况数据集
void generateAverageCaseData(int arr[], int size) {
srand(time(NULL)); // 初始化随机数种子
for (int i = 0; i < size; i++) {
arr[i] = rand() % size; // 生成0到size-1之间的随机数
}
}
// 打印数组元素
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int n = 10000; // 数据规模
int *arr1 = (int *)malloc(n * sizeof(int));
int *arr2 = (int *)malloc(n * sizeof(int));
// 生成并排序最坏情况数据集
generateWorstCaseData(arr1, n);
clock_t start1 = clock();
quickSort(arr1, 0, n - 1);
clock_t end1 = clock();
double time1 = ((double)(end1 - start1)) / CLOCKS_PER_SEC;
printf("最坏情况数据排序完成,用时: %f 秒\n", time1);
// 生成并排序一般情况数据集
generateAverageCaseData(arr2, n);
clock_t start2 = clock();
quickSort(arr2, 0, n - 1);
clock_t end2 = clock();
double time2 = ((double)(end2 - start2)) / CLOCKS_PER_SEC;
printf("一般情况数据排序完成,用时: %f 秒\n", time2);
// 打印排序后的数组(可选)
// printArray(arr1, n);
// printArray(arr2, n);
// 清理内存
free(arr1);
free(arr2);
return 0;
}
```
这段代码中,我们首先定义了快速排序的分区函数和排序函数。然后,我们创建了两个函数来生成不同的数据集,一个用于生成最坏情况下的有序数据,另一个用于生成一般情况下的随机数据。在`main`函数中,我们分配了两个大小为10000的数组,并分别对它们进行排序,同时记录了排序的时间。
请注意,为了得到最坏情况的数据,通常需要先对数据集进行特殊处理,以确保每次分区操作得到的两个子数组中一个为空,另一个包含n-1个元素。对于一般情况,数据是随机生成的。
最后,根据你的要求,以下是三个相关问题:
阅读全文