做题的时候经常出现的一种情况就是超时,尤其是排序中的冒泡排序以及快速排序~
这就要用到sort和qsort,在这里呢~就需要知道它们的用法~~
一,sort
1,结构体
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { char a[20]; }; char str[100][1010]; int cmp(char a,char b){ return strcmp(a,b) < 0; } int main (){ int n; scanf("%d", &n); for(int i = 0; i < n; ++i) scanf("%s",str[i]); sort(str, str + n, cmp); for(int i = 0; i < n; ++i) printf("%s ",str[i]); return 0; }
2,整型
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int cmp(int a, int b){ return a > b; } int main () { int n; int a[10]; scanf("%d",&n); for(int i = 0; i < n; ++i) scanf("%d", &a[i]); sort(a , a + n,cmp); for(int i = 0; i < n; ++i) printf("%d ", a[i]); return 0; }
3,实型
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main () { int n; double a[10]; scanf("%d",&n); for(int i = 0; i < n; ++i) scanf("%lf", &a[i]); sort(a , a + n); for(int i = 0; i < n; ++i) printf("%lf ", a[i]); return 0; }
4,字符型
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int cmp(char a, char b){ return a > b; } int main (){ char a[10]; scanf("%s", a); sort(a, a + 3,cmp); printf("%s\n", a); return 0; }
二,qsort
1,结构体
#include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int u,w; double v; char str[1010]; }b[1010]; int cmp(const void *a,const void *b) { if((*(node *)a).u==(*(node *)b).u) return (*(node *)b).w-(*(node *)a).w; return (*(node *)a).u-(*(node *)b).u; } int main() { int n,i; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d %d",&b[i].u,&b[i].w); } qsort(b,n,sizeof(b[0]),cmp); for(i=0;i<n;i++) { printf("%d %d\n",b[i].u ,b[i].w); } }
2,整型
#include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int *)b-*(int *)a; } int main() { int n; int a[1010]; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } qsort(a,n,sizeof(a[0]),cmp); for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); return 0; }
3,实型
#include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { if(*(double *)a>*(double *)b) return 1; return -1; } int main() { double a[1010]; int n,i; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%lf",&a[i]); } qsort(a,n,sizeof(a[0]),cmp); for(i=0;i<n;i++) { printf("%lf ",a[i]); } printf("\n"); }
4,字符型
#include<stdio.h> #include<stdlib.h> #include<string.h> char str[100][1010]; int cmp(const void *a,const void *b) { return strcmp((char *)b,(char *)a); } int main() { int n,i; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",str[i]); } qsort(str,n,sizeof(str[0]),cmp); for(i=0;i<n;i++) { printf("%s\n",str[i]); } return 0; }
个人觉得sort的比较好用~~结构体的最难记~~如下题~~
3 1 000007 James 85 000010 Amy 90 000001 Zoe 60 4 2 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 98 4 3 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 90 0 0
Case 1: 000001 Zoe 60 000007 James 85 000010 Amy 90 Case 2: 000010 Amy 90 000002 James 98 000007 James 85 000001 Zoe 60 Case 3: 000001 Zoe 60 000007 James 85 000002 James 90 000010 Amy 90
代码如下~
#include<stdio.h> #include<cstring> #include<stdlib.h> #include<algorithm> using namespace std; struct str { int num; char name[10]; int grade; }student[100001]; int cmp1(str s1,str s2) { return s1.num<s2.num; } int cmp2(str s1,str s2) { if(strcmp(s1.name,s2.name)==0) return s1.num<s2.num; return strcmp(s1.name,s2.name)<0; } int cmp3(str s1,str s2) { if(s1.grade==s2.grade) return s1.num<s2.num; return s1.grade<s2.grade; } int main() { int n,c,i,j=0; while(scanf("%d%d",&n,&c)&&n!=0) { for(i=0;i<n;i++) scanf("%d%s%d",&student[i].num,&student[i].name,&student[i].grade); if(c==1) sort(student,student+n,cmp1); if(c==2) sort(student,student+n,cmp2); if(c==3) sort(student,student+n,cmp3); printf("Case %d\n",++j); for(i=0;i<n;i++) printf("%06d %s %d\n",student[i].num,student[i].name,student[i].grade); } return 0; }