随机产生300个整数构成的序列,分别以直接插入、冒泡、希尔、快速、归并等排序算法排序,并统计各自的比较次数。用c语言
时间: 2023-08-18 10:07:53 浏览: 44
以下是基于C语言的示例代码,实现了随机产生300个整数序列,以及使用直接插入、冒泡、希尔、快速、归并等排序算法进行排序,并统计比较次数的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 生成随机整数序列
void generate_random(int nums[], int n) {
srand(time(NULL));
for (int i = 0; i < n; i++) {
nums[i] = rand() % 1000 + 1;
}
}
// 直接插入排序
int insertion_sort(int nums[], int n) {
int count = 0;
for (int i = 1; i < n; i++) {
int j = i;
int temp = nums[i];
while (j > 0 && nums[j-1] > temp) {
nums[j] = nums[j-1];
j--;
count++;
}
nums[j] = temp;
}
return count;
}
// 冒泡排序
int bubble_sort(int nums[], int n) {
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-i-1; j++) {
if (nums[j] > nums[j+1]) {
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
count++;
}
}
}
return count;
}
// 希尔排序
int shell_sort(int nums[], int n) {
int count = 0;
int gap = n / 2;
while (gap > 0) {
for (int i = gap; i < n; i++) {
int temp = nums[i];
int j = i - gap;
while (j >= 0 && nums[j] > temp) {
nums[j+gap] = nums[j];
j -= gap;
count++;
}
nums[j+gap] = temp;
}
gap /= 2;
}
return count;
}
// 快速排序
int quick_sort(int nums[], int left, int right) {
int count = 0;
if (left >= right) {
return count;
}
int pivot = nums[left];
int i = left, j = right;
while (i < j) {
while (i < j && nums[j] >= pivot) {
j--;
count++;
}
nums[i] = nums[j];
while (i < j && nums[i] <= pivot) {
i++;
count++;
}
nums[j] = nums[i];
}
nums[i] = pivot;
count += quick_sort(nums, left, i-1);
count += quick_sort(nums, i+1, right);
return count;
}
// 归并排序
int merge_sort(int nums[], int left, int right) {
int count = 0;
if (left >= right) {
return count;
}
int mid = left + (right - left) / 2;
count += merge_sort(nums, left, mid);
count += merge_sort(nums, mid+1, right);
int temp[right-left+1];
int i = left, j = mid+1, k = 0;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
count++;
}
while (i <= mid) {
temp[k++] = nums[i++];
}
while (j <= right) {
temp[k++] = nums[j++];
}
for (int p = 0; p < k; p++) {
nums[left+p] = temp[p];
}
return count;
}
int main() {
int nums[300];
int n = sizeof(nums) / sizeof(nums[0]);
generate_random(nums, n);
int insertion_count = insertion_sort(nums, n);
int bubble_count = bubble_sort(nums, n);
int shell_count = shell_sort(nums, n);
int quick_count = quick_sort(nums, 0, n-1);
int merge_count = merge_sort(nums, 0, n-1);
printf("直接插入排序比较次数:%d\n", insertion_count);
printf("冒泡排序比较次数:%d\n", bubble_count);
printf("希尔排序比较次数:%d\n", shell_count);
printf("快速排序比较次数:%d\n", quick_count);
printf("归并排序比较次数:%d\n", merge_count);
return 0;
}
```
以上代码中,使用了C语言的rand函数生成了一个由300个随机整数构成的序列。然后分别定义了直接插入、冒泡、希尔、快速、归并等排序算法,并在每个算法中通过计数器统计比较次数。最后输出了每个算法的比较次数。