用c语言写出比较归并排序和快速排序的关键字比较次数和关键字移动次数的代码,要求待排序的表长不能小于100;其中的数据要用伪随机数生成程序产生至少要用5组不同的输入数据比较;代码要给出注释
时间: 2024-03-13 17:46:58 浏览: 45
好的,以下是用C语言实现归并排序和快速排序的关键字比较次数和关键字移动次数的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_LENGTH 100000
// 产生伪随机数的生成程序
int pseudo_rand(int start, int end) {
return rand() % (end - start + 1) + start;
}
// 归并排序
void merge_sort(int arr[], int left, int right, int *comp_count, int *move_count) {
if (left >= right) {
return;
}
int mid = (left + right) / 2;
merge_sort(arr, left, mid, comp_count, move_count);
merge_sort(arr, mid + 1, right, comp_count, move_count);
int temp[MAX_LENGTH];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
(*comp_count)++;
if (arr[i] < arr[j]) {
(*move_count)++;
temp[k++] = arr[i++];
} else {
(*move_count)++;
temp[k++] = arr[j++];
}
}
while (i <= mid) {
(*move_count)++;
temp[k++] = arr[i++];
}
while (j <= right) {
(*move_count)++;
temp[k++] = arr[j++];
}
for (int p = 0; p < k; p++) {
(*move_count)++;
arr[left + p] = temp[p];
}
}
// 快速排序
void quick_sort(int arr[], int left, int right, int *comp_count, int *move_count) {
if (left >= right) {
return;
}
int i = left, j = right, temp = arr[left];
while (i < j) {
while (i < j && arr[j] >= temp) {
(*comp_count)++;
j--;
}
if (i < j) {
(*move_count)++;
arr[i++] = arr[j];
}
while (i < j && arr[i] <= temp) {
(*comp_count)++;
i++;
}
if (i < j) {
(*move_count)++;
arr[j--] = arr[i];
}
}
arr[i] = temp;
quick_sort(arr, left, i - 1, comp_count, move_count);
quick_sort(arr, i + 1, right, comp_count, move_count);
}
int main() {
// 设置随机数种子
srand(time(NULL));
// 产生5组随机数据
int arr[5][MAX_LENGTH];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < MAX_LENGTH; j++) {
arr[i][j] = pseudo_rand(0, MAX_LENGTH);
}
}
// 对每组数据进行排序并输出关键字比较次数和关键字移动次数
for (int i = 0; i < 5; i++) {
int comp_count = 0, move_count = 0;
merge_sort(arr[i], 0, MAX_LENGTH - 1, &comp_count, &move_count);
printf("Merge Sort:\n");
printf("Comp Count: %d\n", comp_count);
printf("Move Count: %d\n", move_count);
comp_count = 0, move_count = 0;
quick_sort(arr[i], 0, MAX_LENGTH - 1, &comp_count, &move_count);
printf("Quick Sort:\n");
printf("Comp Count: %d\n", comp_count);
printf("Move Count: %d\n", move_count);
printf("\n");
}
return 0;
}
```
注释已经加在代码中,简单说明一下:
- `pseudo_rand()` 函数用于产生指定区间内的伪随机数。
- `merge_sort()` 实现了归并排序,并统计了关键字比较次数和关键字移动次数。
- `quick_sort()` 实现了快速排序,并统计了关键字比较次数和关键字移动次数。
- `main()` 函数用于产生 5 组随机数据,对每组数据进行排序并输出关键字比较次数和关键字移动次数。
以上代码中使用 `MAX_LENGTH` 宏定义为 100000,因此待排序的表长不能小于 100。同时,由于每次产生随机数据的种子都不同,因此每次运行程序得到的随机数据也都不同。
阅读全文