//排序实战
#include <stdio.h>
void temp(int *p,int *q)
{
int t;
t=*p;
*p=*q;
*q=t;
}
void quicksort(int *a,int i,int j)
{
if(i<=j) return;
int start,end;
start=i;
end=j;
while(i<j)
{
while(a[j]>=a[start]&&j>i) j--;
while(a[i]<=a[start]&&j>i) i++;
temp(a+i,a+j);
}
temp(a+i,a+start);
quicksort(a,start,i-1);
quicksort(a,i+1,end);
}
int main()
{
int a[10]={7,4,1,2,5,8,9,6,3,10};
int i,j;
int min,t;
quicksort(a,0,9);
for(i=0;i<10;i++)
printf("%4d",a[i]);
}
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
c语言快速排序找错111
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答 默认 最新
关注
引自免费微信小程序:皆我百晓生
你提供的快速排序代码存在一个问题,导致其无法正确地对数组进行排序。问题出在
while
循环条件判断上,以及递归调用时的边界处理。问题1: 在
while(i<j)
循环中,交换元素的条件没有正确终止循环。当找到一个满足条件的元素时,应当立即跳出循环并交换元素,而不是继续检查剩余元素。修正后的 while 循环部分:
while(i < j) { while(a[j] > a[start] && i < j) j--; if(i < j) { // 添加此条件判断以避免无效交换 while(a[i] <= a[start] && i < j) i++; temp(a+i, a+j); } }
问题2: 初始递归调用时的条件错误。当
i<=j
应该返回时,实际应该是在i<j
时才执行后续的排序逻辑。修正后的 quicksort 函数入口条件:
void quicksort(int *a, int i, int j) { if(i >= j) return; // 修改这里为 i >= j // ... 其他代码保持不变 ... }
综上,修复后的完整代码如下:
#include <stdio.h> void temp(int *p, int *q) { int t; t = *p; *p = *q; *q = t; } void quicksort(int *a, int i, int j) { if (i >= j) return; int start = i; int end = j; while (i < j) { while (a[j] > a[start] && i < j) j--; if (i < j) { while (a[i] <= a[start] && i < j) i++; temp(a + i, a + j); } } temp(a + i, a + start); quicksort(a, start, i - 1); quicksort(a, i + 1, end); } int main() { int a[10] = {7, 4, 1, 2, 5, 8, 9, 6, 3, 10}; int min, t; quicksort(a, 0, 9); for (int i = 0; i < 10; i++) printf("%4d", a[i]); return 0; }
现在这个修正过的快速排序算法应该可以正常工作了。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥200 csgo2的viewmatrix值是否还有别的获取方式
- ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
- ¥15 请把下列每一行代码完整地读懂并注释出来
- ¥15 pycharm运行main文件,显示没有conda环境
- ¥15 易优eyoucms关于二级栏目调用的问题
- ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
- ¥15 为什么eclipse不能再下载了?
- ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
- ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
- ¥15 特定网页无法访问,已排除网页问题