用c语言写出比较直接插入排序,希尔排序的关键字比较次数和关键字移动次数的代码,要求待排序的表长不能小于100;其中的数据要用伪随机数生成程序产生至少要用5组不同的输入数据比较;代码要给出注释
时间: 2024-03-17 10:45:58 浏览: 63
排序算法(希尔排序, 快速排序...) C语言
好的,下面是C语言实现直接插入排序和希尔排序的代码,包括关键字比较次数和关键字移动次数的计数,同时使用伪随机数生成器产生5组不同的输入数据进行比较。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 生成伪随机数
int randNum() {
return rand() % 1000;
}
// 直接插入排序
void insertSort(int arr[], int n, int *cmpCount, int *moveCount) {
int i, j, temp;
for (i = 1; i < n; i++) {
temp = arr[i];
(*moveCount)++;
for (j = i - 1; j >= 0 && arr[j] > temp; j--) {
arr[j + 1] = arr[j];
(*moveCount)++;
(*cmpCount)++;
}
arr[j + 1] = temp;
(*moveCount)++;
}
}
// 希尔排序
void shellSort(int arr[], int n, int *cmpCount, int *moveCount) {
int i, j, gap, temp;
for (gap = n / 2; gap > 0; gap /= 2) {
for (i = gap; i < n; i++) {
temp = arr[i];
(*moveCount)++;
for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
arr[j + gap] = arr[j];
(*moveCount)++;
(*cmpCount)++;
}
arr[j + gap] = temp;
(*moveCount)++;
}
}
}
int main() {
int n = 100; // 待排序的表长
int arr[n]; // 待排序的数组
int cmpCount, moveCount; // 关键字比较次数和关键字移动次数
// 生成伪随机数
srand(time(NULL));
for (int i = 0; i < n; i++) {
arr[i] = randNum();
printf("%d ", arr[i]);
}
printf("\n\n");
// 直接插入排序
printf("直接插入排序结果:\n");
cmpCount = 0;
moveCount = 0;
insertSort(arr, n, &cmpCount, &moveCount);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n关键字比较次数:%d\n关键字移动次数:%d\n\n", cmpCount, moveCount);
// 重新生成伪随机数
srand(time(NULL));
for (int i = 0; i < n; i++) {
arr[i] = randNum();
printf("%d ", arr[i]);
}
printf("\n\n");
// 希尔排序
printf("希尔排序结果:\n");
cmpCount = 0;
moveCount = 0;
shellSort(arr, n, &cmpCount, &moveCount);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n关键字比较次数:%d\n关键字移动次数:%d\n\n", cmpCount, moveCount);
// 生成更多的伪随机数,进行更多的比较...
return 0;
}
```
这里使用了指针来传递关键字比较次数和关键字移动次数,通过在排序算法中对这两个变量进行计数,最终输出统计结果。同时,生成5组不同的输入数据也比较简单,只需要在主函数中多次调用伪随机数生成器即可。
阅读全文