快速排序,程序崩溃了怎么搞?#include<iostream>

快速排序,程序中间崩溃了是怎么回事?调试时底下窗口给的数据应该怎么看呐

img

#include<iostream>
#include<algorithm>
using namespace std;

typedef struct student{
    int num;
    double chinese;
    int math;
    double eglish;
    double sum;
}list[9];

void bubble_sort(student a[], int m,int n) {//m代表排序的科目,n代表总人数
    for (int i = n - 1; i >= 0; i--) {
        int flag = 0;
        for (int j = 0; j < i; j++) {//一趟循环
            if (m == 1) {
                if (a[j].chinese > a[j + 1].chinese) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            }
            else if (m == 2) {
                if (a[j].math > a[j + 1].math) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            }
            else if(m==3){
                if (a[j].eglish > a[j + 1].eglish) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            
            }
            else {
                if (a[j].sum > a[j + 1].sum) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            }
        }
        if (flag == 0) break;//这一趟循环时没有交换元素,即排序已经完成,跳出循环 
    }

}

//快速排序
//1.选主元
student median3(student a[], int left, int right,int m){//选取开头,结尾,中位元素的中间值作为首元素,m为选择的科目
    int center = (left + right) / 2;
    if (m == 1) {
        if (a[left].math > a[center].math)
            swap(a[left], a[center]);
        if (a[left].math > a[right].math)
            swap(a[left], a[right]);//先分别比较第一个元素和中间,最后一个元素的大小,交换后保证第一个元素时最小的,然后再比较后面两个元素
        if (a[center].math > a[right].math)
            swap(a[center], a[right]);//排序完成
        swap(a[center], a[right - 1]);//将中位数放在最后一个元素前面,这样就可以只考虑第二个元素到倒数第三个元素
        return a[right - 1];
    }

    if (m == 2) {
        if (a[left].sum > a[center].sum)
            swap(a[left], a[center]);
        if (a[left].sum > a[right].sum)
            swap(a[left], a[right]);//先分别比较第一个元素和中间,最后一个元素的大小,交换后保证第一个元素时最小的,然后再比较后面两个元素
        if (a[center].sum > a[right].sum)
            swap(a[center], a[right]);//排序完成
        swap(a[center], a[right - 1]);//将中位数放在最后一个元素前面,这样就可以只考虑第二个元素到倒数第三个元素
        return a[right - 1];
    }
}

void quicksort(student a[], int left, int right, int m) {//m为比较的科目
    if (m == 1) {
        student pivot= median3(a, left, right,m);
        int i = left;
        int j = right - 1;
        for (;;) {
            while (a[++i].math < pivot.math);
            while (a[--j].math > pivot.math);
            if (i < j) {
                swap(a[i], a[j]);
            }
            else break;
        }
        swap(a[i], a[right - 1]);
        quicksort(a, left, i - 1,m);
        quicksort(a, i + 1, right,m);
    }
    if (m == 2) {
        student pivot = median3(a, left, right,m);
        int i = left;
        int j = right - 1;
        for (;;) {
            while (a[++i].sum < pivot.sum);
            while (a[--j].sum > pivot.sum);
            if (i < j) {
                swap(a[i], a[j]);
            }
            else break;
        }
        swap(a[i], a[right - 1]);
        quicksort(a, left, i - 1, m);
        quicksort(a, i + 1, right, m);
    }
}
template<typename elementype>
void quick_sort(elementype a[], int n,int m) {
    quicksort(a, 0, n - 1,m);

}

void show(student* stu) {
    for (int i = 1; i <= 9; i++) {
        cout << stu[i].num << "        " << stu[i].chinese << "    " << stu[i].math <<"    " << stu[i].eglish << "        " << stu[i].sum << endl;
    }

}
int main() {
    student stu[10];//登记成绩
    for (int i = 1; i <= 9; i++) {
        stu[i].num = 20010000+i;
    }
    stu[1].chinese = 85.0;
    stu[2].chinese = 92.5;
    stu[3].chinese = 95.0;
    stu[4].chinese = 85.0;
    stu[5].chinese = 96.0;
    stu[6].chinese = 72.0;
    stu[7].chinese = 65.0;
    stu[8].chinese = 88.0;
    stu[9].chinese = 96.5;


    stu[1]. math = 88;
    stu[2]. math = 91;
    stu[3]. math = 98;
    stu[4]. math = 87;
    stu[5]. math = 93;
    stu[6]. math = 76;
    stu[7]. math = 53;
    stu[8]. math = 94;
    stu[9]. math = 83;

    stu[1]. eglish = 97.0;
    stu[2]. eglish = 95.0;
    stu[3]. eglish = 99.0;
    stu[4]. eglish = 96.5;
    stu[5]. eglish = 100.0;
    stu[6]. eglish = 70.5;
    stu[7]. eglish = 53.0;
    stu[8]. eglish = 90.5;
    stu[9]. eglish = 65.0;


    for (int i = 1; i <= 9; i++) {
        stu[i]. sum = stu[i]. chinese + stu[i]. math + stu[i]. eglish;    
    }



    //冒泡排序
    cout << "冒泡排序结果:" << endl;
    bubble_sort(stu, 1, 9);
    cout << "按照数学成绩排名:" << endl;
    show(stu);
    bubble_sort(stu, 4, 9);
    cout << "按照总成绩排名:" << endl;
    show(stu);

    //快速排序
    median3(stu, 1, 9,1);
    quicksort(stu, 1, 9,1);
    quick_sort(stu, 9,1);
    show(stu);

    return 0;
}

快速排序没有返回
导致递归深度太大,爆栈了
一些细节
如边界问题
还需要考虑一下

#include<iostream>
#include<algorithm>
using namespace std;
 
typedef struct student{
    int num;
    double chinese;
    int math;
    double eglish;
    double sum;
}list[9];
 
void bubble_sort(student a[], int m,int n) {//m代表排序的科目,n代表总人数
    for (int i = n - 1; i >= 0; i--) {
        int flag = 0;
        for (int j = 0; j < i; j++) {//一趟循环
            if (m == 1) {
                if (a[j].chinese > a[j + 1].chinese) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            }
            else if (m == 2) {
                if (a[j].math > a[j + 1].math) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            }
            else if(m==3){
                if (a[j].eglish > a[j + 1].eglish) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            
            }
            else {
                if (a[j].sum > a[j + 1].sum) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            }
        }
        if (flag == 0) break;//这一趟循环时没有交换元素,即排序已经完成,跳出循环 
    }
 
}
 
//快速排序
//1.选主元
/*student median3(student a[], int left, int right,int m){//选取开头,结尾,中位元素的中间值作为首元素,m为选择的科目
    int center = (left + right) / 2;
    if (m == 1) {
        if (a[left].math > a[center].math)
            swap(a[left], a[center]);
        if (a[left].math > a[right].math)
            swap(a[left], a[right]);//先分别比较第一个元素和中间,最后一个元素的大小,交换后保证第一个元素时最小的,然后再比较后面两个元素
        if (a[center].math > a[right].math)
            swap(a[center], a[right]);//排序完成
        swap(a[center], a[right - 1]);//将中位数放在最后一个元素前面,这样就可以只考虑第二个元素到倒数第三个元素
        return a[right - 1];
    }
 
    if (m == 2) {
        if (a[left].sum > a[center].sum)
            swap(a[left], a[center]);
        if (a[left].sum > a[right].sum)
            swap(a[left], a[right]);//先分别比较第一个元素和中间,最后一个元素的大小,交换后保证第一个元素时最小的,然后再比较后面两个元素
        if (a[center].sum > a[right].sum)
            swap(a[center], a[right]);//排序完成
        swap(a[center], a[right - 1]);//将中位数放在最后一个元素前面,这样就可以只考虑第二个元素到倒数第三个元素
        return a[right - 1];
    }
}*/
 
void quicksort(student a[], int left, int right, int m) {//m为比较的科目
    if(left >= right-1)
        return;
    if (m == 1) {
        student pivot= a[left+right>>1];
        int i = left - 1;
        int j = right + 1;
        while (i < j) {
            do i++;while(a[i].math < pivot.math);
            do j--;while(a[j].math > pivot.math);
            if (i < j) {
                swap(a[i], a[j]);
            }
        }
        quicksort(a, left, j,m);
        quicksort(a, j + 1, right,m);
    }
    if (m == 2) {
        student pivot= a[left+right>>1];
        int i = left - 1;
        int j = right + 1;
        while (i < j) {
            do i++;while (a[i].sum < pivot.sum);
            do j--;while (a[j].sum > pivot.sum);
            if (i < j) {
                swap(a[i], a[j]);
            }
        }
        quicksort(a, left, j, m);
        quicksort(a, j + 1, right, m);
    }
}

void quick_sort(student a[], int n,int m) {
    quicksort(a, 1, n, m);
 
}
 
void show(student* stu) {
    for (int i = 1; i <= 9; i++) {
        cout << stu[i].num << "        " << stu[i].chinese << "    " << stu[i].math <<"    " << stu[i].eglish << "        " << stu[i].sum << endl;
    }
 
}
int main() {
    student stu[10];//登记成绩
    for (int i = 1; i <= 9; i++) {
        stu[i].num = 20010000+i;
    }
    stu[1].chinese = 85.0;
    stu[2].chinese = 92.5;
    stu[3].chinese = 95.0;
    stu[4].chinese = 85.0;
    stu[5].chinese = 96.0;
    stu[6].chinese = 72.0;
    stu[7].chinese = 65.0;
    stu[8].chinese = 88.0;
    stu[9].chinese = 96.5;
 
 
    stu[1]. math = 88;
    stu[2]. math = 91;
    stu[3]. math = 98;
    stu[4]. math = 87;
    stu[5]. math = 93;
    stu[6]. math = 76;
    stu[7]. math = 53;
    stu[8]. math = 94;
    stu[9]. math = 83;
 
    stu[1]. eglish = 97.0;
    stu[2]. eglish = 95.0;
    stu[3]. eglish = 99.0;
    stu[4]. eglish = 96.5;
    stu[5]. eglish = 100.0;
    stu[6]. eglish = 70.5;
    stu[7]. eglish = 53.0;
    stu[8]. eglish = 90.5;
    stu[9]. eglish = 65.0;
 
 
    for (int i = 1; i <= 9; i++) {
        stu[i]. sum = stu[i]. chinese + stu[i]. math + stu[i]. eglish;    
    }
 
 
 
    //冒泡排序
    cout << "冒泡排序结果:" << endl;
    bubble_sort(stu, 1, 9);
    cout << "按照数学成绩排名:" << endl;
    show(stu);
    bubble_sort(stu, 4, 9);
    cout << "按照总成绩排名:" << endl;
    show(stu);
 
    //快速排序
    //median3(stu, 1, 9, 1);
    //system("pause");
    quicksort(stu, 1, 9, 1);
    //system("pause");
    quick_sort(stu, 9, 1);
    show(stu);
 
    return 0;
}