2302_79644694 2024-03-09 17:53 采纳率: 42.9%
浏览 1
已结题

c语言快速排序找错111


//排序实战

#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]);
}
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-09 17:54
    关注

    引自免费微信小程序:皆我百晓生

    你提供的快速排序代码存在一个问题,导致其无法正确地对数组进行排序。问题出在 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;
    }
    

    现在这个修正过的快速排序算法应该可以正常工作了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 3月9日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题