稳定排序
来源:互联网 发布:怎么申请淘宝账号小号 编辑:程序博客网 时间:2024/06/11 06:13
大家都知道,快速排序是不稳定的排序方法。 如果对于数组中出现的任意ai ,aj (i<j),其中ai ==aj ,在进行排序以后ai 一定出现在aj 之前,则认为该排序是稳定的。 某高校招生办得到一份成绩列表,上面记录了考生名字和考生成绩。并且对其使用了某排序算法按成绩进行递减排序。现在请你判断一下该排序算法是否正确,如果正确的话,则判断该排序算法是否为稳定的。
3aa 10bb 10cc 20cc 20bb 10aa 103aa 10bb 10cc 20cc 20aa 10bb 103aa 10bb 10cc 20aa 10bb 10cc 20算法:
#include<cstdio>#include<cstring>#include<algorithm>#include<cstring>using namespace std;struct student{char name[50];int grade;}p[300+5],q[300+5];bool cmp(student a,student b){return a.grade>b.grade;}int main(){int n,i,x=0,y=0,z=0;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++){scanf("%s %d",p[i].name,&p[i].grade);}for(i=0;i<n;i++){scanf("%s %d",q[i].name,&q[i].grade);}sort(p,p+n,cmp);for(i=0;i<n;i++){if((p[i].grade==q[i].grade)&&(strcmp((p[i].name),q[i].name)==0)) x=1;if((p[i].grade==q[i].grade)&&(strcmp((p[i].name),q[i].name)!=0))y=1;if((p[i].grade!=q[i].grade)&&(strcmp((p[i].name),q[i].name)!=0))z=1;}if(x==1&&y==0&&z==0)printf("Right\n");if(x==1&&y==1&&z==0){printf("Not Stable\n");for(i=0;i<n;i++)printf("%s %d\n",p[i].name,p[i].grade);}if(x==1&&y==1&&z==1){printf("Error\n");for(i=0;i<n;i++)printf("%s %d\n",p[i].name,p[i].grade);}}return 0;}这个是自己写的,虽然结果是对的但提交不对,没看出来为什么,这道题做的时候出现了两个错误导致程序开始运行不对,首先是用strcmp 函数比较字符串,
应该算是常识了,也不知道自己怎么直接上去比了,下次要记住,还有就是用&&时,要在strcmp前后加个小括号,不然会错误。不过我看优先级等号的大啊
不太懂。下面附上学长的程序:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { char name[55]; int grade; int num; }a[311]; bool cmp(node a,node b) { if (a.grade != b.grade) return a.grade > b.grade; else return a.num < b.num; } int main() { int n; bool flag1; //是否正确排序 bool flag2; //是否稳定排序 while (~scanf ("%d",&n)) { flag1 = flag2 = true; for (int i = 0 ; i < n ; i++) { scanf ("%s %d",a[i].name,&a[i].grade); a[i].num = i; } sort (a,a+n,cmp); for (int i = 0 ; i < n ; i++) { char t1[55]; int t2; scanf ("%s %d",t1,&t2); if (t2 != a[i].grade) flag1 = false; else if (strcmp (t1,a[i].name) != 0) flag2 = false; } if (!flag1) //错误排序 { printf ("Error\n"); for (int i = 0 ; i < n ; i++) printf ("%s %d\n",a[i].name,a[i].grade); } else { if (flag2) printf ("Right\n"); else { printf ("Not Stable\n"); for (int i = 0 ; i < n ; i++) printf ("%s %d\n",a[i].name,a[i].grade); } } } return 0; }