N—E—E 2021-11-24 11: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 12: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月3日
  • 已采纳回答 11月25日
  • 创建了问题 11月24日

悬赏问题

  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?