2302_79644694 2024-03-02 21:42 采纳率: 42.9%
浏览 6
已结题

c语言快速排序找问题


#include <stdio.h>

void temp(int *a,int *b)
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
}


void quicksort(int *a,int left,int right)
{
    int f,start,end;

    start=left;
    end=right;

    f=left;

    while(left<right)
    {
        while(a[right]>=a[f]&&right>left)
            right--;
        while(a[left]<=a[f]&&left<right)
            left++;

        temp(a+left,a+right);
    }

    temp(a+left,a+f);

    quicksort(a,start,left-1);
    quicksort(a,left+1,end);
}


int main()
{
    int a[10]={7,4,1,2,5,8,3,6,9,10};

    quicksort(a,0,9);

    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
}
  • 写回答

6条回答 默认 最新

  • 鑫宝Code 全栈领域优质创作者 2024-03-14 08:42
    关注
    此回答引用GPT4,由博主鑫宝Code参考后得出

    您提供的C语言代码实现了一个快速排序算法,但其中存在一个逻辑错误。在while(left<right)循环中,你没有正确更新枢轴(pivot)的位置。以下是修正后的代码:

    #include <stdio.h>
    
    void swap(int *a, int *b) {
        int t;
        t = *a;
        *a = *b;
        *b = t;
    }
    
    void quicksort(int *a, int left, int right) {
        if (left >= right) return; // 如果left已经大于等于right,说明数组只有一个或零个元素,无需继续分割
    
        int f = a[left]; // 将最左边的元素作为初始枢轴
        int i = left, j = right;
    
        while (i < j) {
            while (a[j] >= f && i < j) {
                j--;
            }
            while (a[i] <= f && i < j) {
                i++;
            }
    
            if (i < j) { // 防止在i和j交叉时依然交换
                swap(a + i, a + j);
            }
        }
    
        // 将枢轴元素放到最终位置
        a[left] = a[i];
        a[i] = f;
    
        // 递归对左右两边进行快速排序
        quicksort(a, left, i - 1);
        quicksort(a, i + 1, right);
    }
    
    int main() {
        int a[10] = {7, 4, 1, 2, 5, 8, 3, 6, 9, 10};
    
        quicksort(a, 0, 9);
    
        for (int i = 0; i < 10; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    
        return 0;
    }
    

    主要修改点:

    1. 添加了当left >= right时直接返回的条件,以避免处理单个或零个元素的情况。
    2. while循环外部移动枢轴元素到其最终位置。
    3. 修改swap函数名称为swap,使其更具可读性。

    现在这段代码应该能正确地对数组进行快速排序了。

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 专家已采纳回答 3月15日
  • 创建了问题 3月2日

悬赏问题

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