这个快速排序哪里错了?

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

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

问题相关代码,请勿粘贴截图
#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

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

觉得你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

为啥会越界呢,只剩下两个元素一交换就退出了吧

这三个条件不满足应该往下遍历吧