快速排序,程序中间崩溃了是怎么回事?调试时底下窗口给的数据应该怎么看呐
#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;
}