选择排序
1.基本思想:每一趟从待排序的数据元素选出最小或最大的一个元素,数按序排放在待排序的元素的最前端,直到全部待排序的元素排完
2.基本代码
px(int r[]) { for(int i=1;i<n;i++) { int k=i; for(int j=i+1;j<=n;j++) { if(a[k]>a[j] K=J; } if(k!=i) { int tmp=a[i]; a[i]=a[k]; a[k]=a[i]; } } }
3.例题
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9
90788004 68.4
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,k,a[101]; float b[101]; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { cin>>a[i]; cin>>b[i]; } for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) { if(b[i]<b[j]) { float tmp=b[i]; b[i]=b[j]; b[j]=tmp; int amp=a[i]; a[i]=a[j]; a[j]=amp; } } } for(int i=1;i<=n;i++) { if(i==k) { cout<<a[i]<<" "; printf("%.6g",b[i]); } } return 0; }
冒泡排序
1.基本思想:依次比较相邻的两个数,把大的放前面小的放后面。即先比较第一个和第二个,在比较第二个和第三个。。。。。。直到比较完最后两个数,则最小的数一定在最后面
2.核心代码
for(int i=1;i<n;i++) for(int j=1;j<=n-i;j++) { int tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; }
3.例题
给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。
10 1 3 2 6 5 4 9 8 7 10
1,3,5,7,9
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,l; int a[501],b[501]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]%2!=0) { l++; b[l]=a[i]; } } for(int i=1;i<l;i++) for(int j=1;j<=l-i;j++) if(b[j]>b[j+1]) { int tmp=b[j]; b[j]=b[j+1]; b[j+1]=tmp; } for(int i=1;i<l;i++) printf("%d,",b[i]); printf("%d",b[l]); return 0; }
结构体排序
有同学会说,不就是给结构体排序吗,这个简单,那在这就不都说了
例题
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
4 Kitty 80 Hanmeimei 90 Joey 92 Tim 28
Joey 92 Hanmeimei 90 Kitty 80 Tim 28
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n; struct student { int score; string name; }a[21]; int score_comp(const student &a,const student &b) { if(a.score>b.score) return 1; if(a.score<b.score) return 0; if(a.name<b.name) return 1; return 0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>a[i].name; cin>>a[i].score; } sort(a+1,a+n+1,score_comp); for(int i=1;i<=n;i++) { cout<<a[i].name<<‘ ‘; cout<<a[i].score<<endl; } return 0; }
桶排序
1.基本思想
若带排序的记录的关键词在一个明显的有限范围内(整形)时,可以设计有限个有序桶,每个桶装入一个值(当然可以装入若干个值)
顺序输出各桶的值,将得到一个有序数列。
2.模板
例题:输入n个0到100之间的整数,从小到大排序
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,k; int b[501]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&k); b[k]++; } for(int i=0;i<=100;i++) while(b[i]>0) { printf("%d ",i); b[i]--; } return 0; }
3.例题
给出n和n个整数,希望你从小到大给他们排序
第一行一个正整数n
第二行n个用空格隔开的整数
输出仅一行,从小到大输出n个用空格隔开的整数
3
3 1 2
1 2 3
1<=n<=100000
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,k; int b[100001]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&k); b[k]++; } for(int i=0;i<=100000;i++) while(b[i]>0) { printf("%d ",i); b[i]--; } return 0; }
原文:http://www.cnblogs.com/z360/p/6415253.html