C语言随机产生300个整数构成的序列分别以直接插入、冒泡、希尔、快速、归并等排序算法排序并统计各自的比较次数
时间: 2023-12-22 07:02:59 浏览: 74
好的,我可以回答您的问题。以下是解答:
首先,您需要生成一个包含300个随机整数的序列。您可以使用rand()函数来生成随机整数,代码如下:
int a[300];
srand((unsigned)time(NULL));
for(int i=0; i<300; i++){
a[i] = rand()%1000; // 生成随机整数
}
接下来,您可以使用五种排序算法对该序列进行排序,并统计每个算法的比较次数。代码如下:
// 直接插入排序
int count1 = 0; // 记录比较次数
for(int i=1; i<300; i++){
int temp = a[i], j;
for(j=i-1; j>=0 && temp<a[j]; j--){
count1++; // 比较次数加1
a[j+1] = a[j];
}
count1++; // 比较次数加1
a[j+1] = temp;
}
// 冒泡排序
int count2 = 0; // 记录比较次数
for(int i=0; i<299; i++){
for(int j=0; j<299-i; j++){
count2++; // 比较次数加1
if(a[j] > a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
// 希尔排序
int count3 = 0; // 记录比较次数
int gap = 300/2;
while(gap > 0){
for(int i=gap; i<300; i++){
int temp = a[i], j=i;
while(j>=gap && temp<a[j-gap]){
count3++; // 比较次数加1
a[j] = a[j-gap];
j -= gap;
}
count3++; // 比较次数加1
a[j] = temp;
}
gap /= 2;
}
// 快速排序
int count4 = 0; // 记录比较次数
void quick_sort(int left, int right){
if(left >= right) return;
int i = left, j = right, pivot = a[left];
while(i < j){
while(i<j && a[j]>=pivot){
count4++; // 比较次数加1
j--;
}
a[i] = a[j];
while(i<j && a[i]<=pivot){
count4++; // 比较次数加1
i++;
}
a[j] = a[i];
}
a[i] = pivot;
quick_sort(left, i-1);
quick_sort(i+1, right);
}
quick_sort(0, 299);
// 归并排序
int count5 = 0; // 记录比较次数
int temp[300];
void merge_sort(int left, int right){
if(left >= right) return;
int mid = (left+right)/2;
merge_sort(left, mid);
merge_sort(mid+1, right);
int i = left, j = mid+1, k = left;
while(i<=mid && j<=right){
count5++; // 比较次数加1
if(a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while(i <= mid) temp[k++] = a[i++];
while(j <= right) temp[k++] = a[j++];
for(int t=left; t<=right; t++)
a[t] = temp[t];
}
merge_sort(0, 299);
最后,您需要将每种排序算法的比较次数输出出来,代码如下:
printf("直接插入排序比较次数:%d\n", count1);
printf("冒泡排序比较次数:%d\n", count2);
printf("希尔排序比较次数:%d\n", count3);
printf("快速排序比较次数:%d\n", count4);
printf("归并排序比较次数:%d\n", count5);
希望这个答案对您有所帮助,如果您有任何问题,请随时问我。
阅读全文