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日

悬赏问题

  • ¥200 基于同花顺supermind的量化策略脚本编辑
  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?