c语言随机产生300个整数构成的序列,分别以直接插入、冒泡、希尔、快速、归并等排序算法排序,并统计各自的比较次数。
时间: 2023-07-31 19:07:56 浏览: 106
以下是一个示例代码,其中包含了直接插入排序、冒泡排序、希尔排序、快速排序、归并排序以及比较次数的统计:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 300
// 直接插入排序
int insertion_sort(int a[], int n) {
int i, j, k, cmp = 0;
for (i = 1; i < n; ++i) {
k = a[i];
for (j = i - 1; j >= 0 && a[j] > k; --j) {
++cmp;
a[j + 1] = a[j];
}
a[j + 1] = k;
}
return cmp;
}
// 冒泡排序
int bubble_sort(int a[], int n) {
int i, j, tmp, cmp = 0;
for (i = 0; i < n - 1; ++i) {
for (j = 0; j < n - 1 - i; ++j) {
++cmp;
if (a[j] > a[j + 1]) {
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
return cmp;
}
// 希尔排序
int shell_sort(int a[], int n) {
int i, j, gap, tmp, cmp = 0;
for (gap = n / 2; gap > 0; gap /= 2) {
for (i = gap; i < n; ++i) {
tmp = a[i];
for (j = i - gap; j >= 0 && a[j] > tmp; j -= gap) {
++cmp;
a[j + gap] = a[j];
}
a[j + gap] = tmp;
}
}
return cmp;
}
// 快速排序
int quick_sort(int a[], int n) {
int i, j, tmp, cmp = 0;
if (n < 2) return 0;
tmp = a[0];
for (i = 1, j = n - 1;;) {
while (i < n && a[i] <= tmp) {
++cmp;
++i;
}
while (a[j] > tmp) {
++cmp;
--j;
}
if (i >= j) break;
a[i] = a[j];
++cmp;
a[j] = a[i];
}
a[j] = tmp;
return cmp + quick_sort(a, j) + quick_sort(a + j + 1, n - j - 1);
}
// 归并排序
int merge_sort(int a[], int n) {
int i, j, k, m, tmp[N], cmp = 0;
for (m = 1; m < n; m *= 2) {
for (i = 0; i < n - m; i += m * 2) {
j = i + m;
k = i;
while (i < j && j < i + m * 2) {
++cmp;
if (a[i] <= a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while (i < k) a[i++] = tmp[i];
}
}
return cmp;
}
int main() {
int a[N], i, cmp;
// 产生随机数
srand((unsigned) time(NULL));
for (i = 0; i < N; ++i) a[i] = rand() % 10000;
// 直接插入排序
cmp = insertion_sort(a, N);
printf("直接插入排序比较次数:%d\n", cmp);
// 冒泡排序
cmp = bubble_sort(a, N);
printf("冒泡排序比较次数:%d\n", cmp);
// 希尔排序
cmp = shell_sort(a, N);
printf("希尔排序比较次数:%d\n", cmp);
// 快速排序
cmp = quick_sort(a, N);
printf("快速排序比较次数:%d\n", cmp);
// 归并排序
cmp = merge_sort(a, N);
printf("归并排序比较次数:%d\n", cmp);
return 0;
}
```
注意,快速排序和归并排序的比较次数是递归计算的,因此需要在函数中返回比较次数并在调用时累加。
阅读全文