C语言快速整理
跟着视频做的,为什么运行到调用快速整理函数sort_arr时,就停止运行了?#include <stdio.h>
int sort_arr(int arr[], int L, int R)
{
int i = L;
int j = R;
int a = (L + R) / 2;
int temp; // 用于互换的中间变量
int pivot = arr; // 以中间的数为比较的基准点
while (i <= j)
{
// 从左到右找到大于基准点的数
while (arr < pivot)
{
i++;
}
// 从右到左找到小于基准点的数
while (arr > pivot)
{
j++;
}
/* 如果当前位置满足arr pivot arr,则arr arr互换位置*/
if (i <= j)
{
temp = arr;
arr = arr;
arr = temp;
i++;
j--;
}
}
/* 当j>i时,说明基准点前后的数字已经全部被i和j检索了一遍*/
/* 如果j还没有检索最左边,则再将arr[最左]到arr为一组,再排一次*/
if (L < j)
{
sort_arr(arr, L, j);
}
/* 如果i还没有检索最右边,则再将arr到arr[最右]为一组,再排一次*/
if (i < R)
{
sort_arr(arr, i, R);
}
// 每次根据基准点排序时都保证了左边总是小于右边
return 0;
}
int main()
{
int num;
printf("要输入的整数个数:");
scanf("%d", &num);
getchar();
int arr;
for (int i = 0; i < num; i++)
{
printf("请输入第%d个数字:", i + 1);
scanf("%d", &arr);
getchar();
}
for (int i = 0; i < num; i++)
{
printf("%d ", arr);
}
sort_arr(arr, 0, (num - 1));
printf("\n排序后打印:\n");
for (int i = 0; i < num; i++)
{
printf("%d ", arr);
}
return 0;
} 你的代码存在几个问题,导致运行不正常。以下是一些关键问题和修正建议:
1. **数组声明问题**:
- `int arr;` 声明应该是一个数组,例如 `int arr;`。
2. **函数参数问题**:
- `int sort_arr(int arr, int L, int R)` 中的 `arr` 应为指针形式 `int *arr`。
3. **基准点选择问题**:
- `int pivot = arr;` 应该是 `int pivot = arr;`。
4. **输入输出问题**:
- 你在填充数组时,只填充了一个元素。
5. **访问数组元素问题**:
- 排序过程中比较和交换数组元素时,访问方式需要修改为 `arr` 和 `arr`。
以下是修改后的代码:
#include <stdio.h>
int sort_arr(int *arr, int L, int R)
{
int i = L;
int j = R;
int a = (L + R) / 2;
int temp;
int pivot = arr;
while (i <= j)
{
while (arr < pivot) i++;
while (arr > pivot) j--;
if (i <= j)
{
temp = arr;
arr = arr;
arr = temp;
i++;
j--;
}
}
if (L < j)
{
sort_arr(arr, L, j);
}
if (i < R)
{
sort_arr(arr, i, R);
}
return 0;
}
int main()
{
int num;
printf("要输入的整数个数:");
scanf("%d", &num);
int arr;
for (int i = 0; i < num; i++)
{
printf("请输入第%d个数字:", i + 1);
scanf("%d", &arr);
}
printf("排序前:\n");
for (int i = 0; i < num; i++)
{
printf("%d ", arr);
}
printf("\n");
sort_arr(arr, 0, num - 1);
printf("排序后:\n");
for (int i = 0; i < num; i++)
{
printf("%d ", arr);
}
printf("\n");
return 0;
}
上述代码修正了所有的关键问题,并且可以正确进行快速排序。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 jackz007 于 2024-10-23 09:25 编辑
代码有一处错误:
// 从左到右找到大于基准点的数
while (arr < pivot)
{
i ++ ;
}
// 从右到左找到小于基准点的数
while (arr > pivot)
{
j ++ ; // 【错误】:应该是 j --
} 学太久了,老眼昏花,没看出来,真是麻烦你了 谢谢
页:
[1]