题目描述冒泡排序算法是对已知的数列进行从小到大的递增排序每个实例输出两行,第一行输出第1轮结果, 第二行输出最终结果
它的排序方法如下:
1.对数列从头开始扫描,比较两个相邻的元素,如果前者大于后者,则交换两者位置
2.重复步骤1,直到没有发生数据交换位置
例子:对数列33 22 55 11 44用冒泡排序
一开始比较33和22, 因为33大于22,所以交换得到22和33;接着比较33和55符合,不交换;接着比较55和11,不符合所以交换位置;接着比较55和44,不符合所以交换位置
第1轮结果: 22 331144 55.
以此类推
第2轮结果: 22 11 33 44 55
第3轮结果: 11 22 33 4455
第4轮没有发生交换,所以结束扫描
输入
第一行输入t,表示有t个测试实例
第二行先输入N表示有N个数据,接着输入N各数据,以空格分开
输出
每个实例输出两行,第一-行输出第1轮结果, 第二行输出最终结果
一开始用
int n;
scanf("%d", &n); // 输入数据的个数
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 输入数据
}
一直提示数组不能使用常量
编译器提示严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E0028 表达式必须含有常量值 Project2
在 C 语言中,数组的大小必须是一个常量表达式,不能是变量。
要解决这个问题,你可以尝试使用编译器支持的数组大小方式,例如使用宏定义或者动态分配数组内存。另外,如果你需要在运行时确定数组的大小,可以考虑使用动态数组(Dynamic Array)或者其他数据结构来代替固定大小的数组。
根据你提供的代码,错误提示确实出现在第 51 行。问题在于你使用了变量
n
来定义数组arr
的大小,而在 C 语言中,数组的大小必须是一个常量表达式。要解决这个问题,你可以使用动态内存分配来创建一个大小可变的数组。可以使用
malloc
函数动态分配内存,并在使用完数组后使用free
函数释放内存。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//malloc 函数的声明位于 <stdlib.h> 头文件中。如果你没有包含该头文件,编译器将无法识别 malloc 函数,从而导致错误。
// 冒泡排序算法 数列进行从小到大 递增排序。
// 排序方法
// 1.对数列从头开始扫描,比较两个相邻的元素, 如果前者大于后者, 则交换两者位置
// 2.重复步骤1, 直到没有发生数据交换位置
// 例子 : 对数列33 22 55 11 44用冒泡排序
// 一开始比较33和22, 因为33大于22, 所以交换得到22和33;接着比较33和55符合,不交换; 接着比较55和11, 不符合所以交换位置;接着比较55和44, 不符合所以交换位置
// 第1轮结果 : 22 33 11 44 55.
// 第2轮结果 : 22 11 33 44 55
// 第3轮结果 : 11 22 33 44 55
// 第4轮没有发生交换, 所以结束扫描
//33 22 55 11 44
//22 33 11 44 55
//11 22 33 44 55
void bubbleSort(int arr[], int n) {
int i, j;
int swapped; // 标记是否发生交换
for (i = 0; i < n - 1; i++) {
swapped = 0; // 初始化为未交换
// 从头开始扫描,比较相邻元素并交换
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换两个元素的位置
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1; // 标记发生交换
}
}
if (i == 0) {
// 输出第一轮结果
for (int i = 0; i < n-1; i++) {
printf("%d ", arr[i]);
}
printf("%d\n", arr[n - 1]);
}
// 如果本轮未发生交换,说明已经有序,提前结束
if (swapped == 0) {
break;
}
}
}
int main() {
int t;
scanf("%d", &t); // 输入测试实例的个数
while (t--) {
int n=0;
scanf("%d", &n); // 输入数据的个数
//int arr[n];
int* arr = (int*)malloc(n * sizeof(int)); // 动态分配数组内存
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 输入数据33 22 55 11 44
}
bubbleSort(arr, n); // 使用冒泡排序算法对数组进行排序
// 输出最终结果
for (int i = 0; i < n-1; i++) {
printf("%d ", arr[i]);
}
printf("%d\n", arr[n - 1]);
free(arr); // 释放动态分配的数组空间
}
return 0;
}