N—E—E 2021-11-24 03:49 采纳率: 59.5%
浏览 95
已结题

这个快速排序哪里错了?

问题遇到的现象和发生背景

不知道哪里错了,排序后数组的数据都变了

问题相关代码,请勿粘贴截图
#include <stdio.h>

//中位数选基准值
int Median3(int a[],int left,int right);

//递归主程序
void Quick_sort(int a[],int left,int right);

//面向用户接口
void QuickSort(int a[],int n);

//交换程序
void swap(int *a,int *b);

#include "QuickSort.h"

int Median3(int a[],int left,int right){
    int centre = (left + right)/2;
    if (a[left] > a[centre]) swap(&a[left],&a[centre]);
    if (a[left] > a[right]) swap(&a[left],&a[right]);
    if (a[centre] > a[right]) swap(&a[centre],&a[right]);

    swap(&a[centre],&a[right-1]); //出于主程序的考虑使用这个技巧
    return a[right-1];
}

void Quick_sort(int a[],int left,int right){
    int i = left,j = right - 1,pivot = Median3(a,left,right); //left一定小于pivot而right一定大于pivot
    if ((right - left) >= 1)
    {
        while(1)
        {
            while (a[++i] < pivot);
            while (a[--j] > pivot);

            if (i < j)
                swap(&a[i],&a[j]);
            else 
                break;
        }
        swap(&a[right - 1],&a[i]);
        Quick_sort(a,left,i-1);
        Quick_sort(a,i+1,right);
    }

}

void QuickSort(int a[],int n){
    Quick_sort(a,0,n-1);
}

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


int main(){
    int a[7] = {2,5,3,7,5,8,2};
    QuickSort(a,7);
    //Median3(a,0,6);
    for (int i = 0; i < 7; i++)
        printf("%d",a[i]);
    while(1);
    return 0;
}


运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

展开全部

  • 写回答

3条回答 默认 最新

  • 广大菜鸟 2021-11-24 04:17
    关注

    觉得你median函数有问题,如果只有一个元素,那你right-1不就越界了吗;还有要考虑是否low,high是否传入的参数越界

    #include <stdio.h>
    #include<stdlib.h>
    //中位数选基准值
    int Median3(int a[],int left,int right);
    //递归主程序
    void Quick_sort(int a[],int left,int right);
    //面向用户接口
    void QuickSort(int a[],int n);
    //交换程序
    void swap(int *a,int *b);
     
    int Median3(int a[],int left,int right){
        int centre = (left + right)/2;
        if (a[left] > a[centre]) swap(&a[left],&a[centre]);
        if (a[left] > a[right]) swap(&a[left],&a[right]);
        if (a[centre] > a[right]) swap(&a[centre],&a[right]);
        //swap(&a[centre],&a[right-1]); //出于主程序的考虑使用这个技巧
        //return a[right-1];
        return a[centre];
    }
    void Quick_sort(int a[],int left,int right){
        if (left>=right) return;
        int i = left-1,j = right+1;
        int pivot = Median3(a,left,right); //left一定小于pivot而right一定大于pivot
        while(j>i)
        {
            while (a[++i] < pivot);
            while (a[--j] > pivot);
            if (i < j)
                swap(&a[i],&a[j]);
        }    
        Quick_sort(a,left,j);
        Quick_sort(a,j+1,right);
    }
    void QuickSort(int a[],int n){
        Quick_sort(a,0,n-1);
    }
    void swap(int *a,int *b){
        int t;
        t = *a;
        *a = *b;
        *b = t;
    }
     
    int main(){
        int a[7] = {2,5,3,7,5,8,2};
        QuickSort(a,7);
        //Median3(a,0,6);
        for (int i = 0; i < 7; i++)
            printf("%d",a[i]);
        system("pause");
        return 0;
    }
     
    

    img

    展开全部

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

报告相同问题?

问题事件

  • 系统已结题 12月2日
  • 已采纳回答 11月24日
  • 创建了问题 11月24日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部