acwing 3638. 排序
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>j;
vector<int>o;
int main(){
cin>>n;
int x;
for(int i=0;i<n;i++){
cin>>x;
if(x%2==0) o.push_back(x);
else j.push_back(x);
}
sort(j.begin(), j.end());
sort(o.begin(), o.end());
for(auto i:j) cout<<i<<" ";
for(auto i:o) cout<<i<<" ";
return 0;
}
5050. 排序
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int m;
cin>>m;
cin>>s;
sort(s.begin(),s.end());
cout<<s<<endl;
s.clear();
}
return 0;
}
5372. 排序
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>a(3);
int a1,a2,a3;
cin>>a1; a[0]=a1;
cin>>a2; a[1]=a2;
cin>>a3; a[2]=a3;
sort(a.begin(),a.end());
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
return 0;
}
3601. 成绩排序
#include<bits/stdc++.h>
using namespace std;
class stu{
public:
string name;
int age;
int sore;
stu(string n,int a,int s){
name=n;
age=a;
sore=s;
}
};
// 比较函数
bool compare(const stu& a,const stu& b) {
if (a.sore != b.sore) {
return a.sore < b.sore; // 按成绩从低到高排序
}
if (a.name != b.name) {
return a.name < b.name; // 按姓名字典序排序
}
return a.age < b.age; // 按年龄从小到大排序
}
int main(){
int n;
cin>>n;
vector<stu>student;
for(int i=0;i<n;i++){
string n;
int a;
int s;
cin>>n>>a>>s;
student.push_back(stu(n, a, s));
}
//stu ss("qhie",12,34);
sort(student.begin(), student.end(),compare);
for (const auto& students : student) {
cout << students.name << " " << students.age << " " << students.sore << endl;
}
return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;
// 比较函数
bool compare(int a,int b) {
return a > b; // 按成绩从低到高排序
}
int main(){
int n;
cin>>n;
vector<int>student;
for(int i=0;i<n;i++){
int a;
cin>>a;
student.push_back(a);
;
}
sort(student.begin(), student.end(),compare);
for (const auto& students : student) {
cout << students << endl;
}
return 0;
}*/
5075. 整数排序
#include<bits/stdc++.h>
using namespace std;
vector<int>a,b,c,d,e,f,g,h,i;
int main(){
long int aa;
while(cin>>aa){
if(aa/10==0&&abs(aa)-10<0){//1位数
a.push_back(aa);
}
else if(aa/100==0&&abs(aa)-100<0){//2
b.push_back(aa);
}
else if(aa/1000==0&&abs(aa)-1000<0){//3
c.push_back(aa);
}
else if(aa/10000==0&&abs(aa)-10000<0){//4
d.push_back(aa);
}
else if(aa/100000==0&&abs(aa)-100000<0){//5
e.push_back(aa);
}
else if(aa/1000000==0&&abs(aa)-1000000<0){//6
f.push_back(aa);
}
else if(aa/10000000==0&&abs(aa)-10000000<0){//7
g.push_back(aa);
}
else if(aa/100000000==0&&abs(aa)-100000000<0){//8
h.push_back(aa);
}
else if(aa/1000000000==0&&abs(aa)-1000000000<0){//9
i.push_back(aa);
}
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
sort(c.begin(),c.end());
sort(d.begin(),d.end());
sort(e.begin(),e.end());
sort(f.begin(),f.end());
sort(g.begin(),g.end());
sort(h.begin(),h.end());
sort(i.begin(),i.end());
if (i.size()!=0)for(auto x:i) cout<<x<<" ";
if (h.size()!=0)for(auto x:h) cout<<x<<" ";
if (g.size()!=0)for(auto x:g) cout<<x<<" ";
if (f.size()!=0)for(auto x:f) cout<<x<<" ";
if (e.size()!=0)for(auto x:e) cout<<x<<" ";
if (d.size()!=0)for(auto x:d) cout<<x<<" ";
if (c.size()!=0)for(auto x:c) cout<<x<<" ";
if (b.size()!=0)for(auto x:b) cout<<x<<" ";
if (a.size()!=0)for(auto x:a) cout<<x<<" ";
return 0;
}
解2
#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int>> nums;
bool compare(const pair<int,int>& a,const pair<int,int>& b){
if(a.first!=b.first) return a.first>b.first;
return a.second<b.second;
}
int getsa(int x){
x=abs(x);
int s=0;
if(x==0) return 1;
while(x){
s++;
x=x/10;
}
return s;
}
int main(){
int aa;
while(cin>>aa){
int x=getsa(aa);
nums.push_back(make_pair(x,aa));
}
sort(nums.begin(),nums.end(),compare);
for(auto i:nums) cout<<i.second<<" ";
return 0;
}
解3,一直超时
#include <bits/stdc++.h>
using namespace std;
//获取位数
int getsa(int x){
for(int i=1;i<=9;i++){
x=abs(x);
if(x/10==0) return i;
else x=x/10;
}
}
// 比较函数
bool compare(int a, int b) {
// 计算两个整数的位数
int lenA = getsa(a);
int lenB = getsa(b);
// 如果位数不同,则位数多的整数排在前面
if (lenA != lenB) {
return lenA > lenB;
}
// 如果位数相同,则按照整数本身由小到大排序
return a < b;
}
int main() {
vector<int>nums;
int aa;
while(cin>>aa) {
nums.push_back(aa);
}
// 使用自定义的比较函数进行排序
sort(nums.begin(), nums.end(), compare);
// 输出排序后的整数
for (auto i:nums) {
cout <<i<<" ";
}
cout << endl;
return 0;
}
1505. 列表排序,这个题一开始总是超时,是输出的原因,cout和cin比较费时
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int N,C;
/*记录包括学生 ID,一个唯一的 6
位数字,名称,一个长度不超过 8
的不含空格的字符串,成绩,一个范围在 [0,100]
的整数。*/
class S{
public:
string id;
string name;
int score;
S(string i,string n,int s):id(i),name(n),score(s){};
};
/*如果 C=1
,则按照 ID 升序的顺序排序。
如果 C=2
,则按照名称以不降序的顺序排序。
如果 C=3
,则按照成绩以不降序的顺序排序。
当出现学生名字相同或是成绩相同的情况时,
按照 ID 升序的顺序,对他们进行排序。*/
bool compare1(const S a,const S b){
return a.id<b.id;
}
bool compare2(const S a,const S b){
if(a.name!=b.name) return a.name<b.name;
return a.id<b.id;
}
bool compare3(const S a,const S b){
if(a.score!=b.score) return a.score<b.score;
return a.id<b.id;
}
int main(){
cin>>N>>C;
string id;
string name;
int score;
vector<S>stu;
for (int i=0;i<N;i++){
cin>>id>>name>>score;
stu.push_back(S(id,name,score));
}
if(C==1) sort(stu.begin(),stu.end(),compare1);
if(C==2) sort(stu.begin(),stu.end(),compare2);
if(C==3) sort(stu.begin(),stu.end(),compare3);
for(int j=0;j<N;j++)
printf("%s %s %d\n",stu[j].id.c_str(),stu[j].name.c_str(),stu[j].score);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int T,N;
/*每块布料包含三种属性:
颜色(C
),一个由小写英文字母组成的字符串,表示布料的颜色。
耐久性(D
),一个整数,表示布料的耐久性。
唯一标识符(U
),一个整数,表示布料的 ID
。*/
class Q{
public:
string C;
int D;
int U;
Q(string c,int d,int u):C(c),D(d),U(u){}
};
/*
阿达按照颜色(C
)字典序升序的顺序对布料进行排序,颜色相同的布料按唯一标识符(U
)升序的顺序进行排序。
查尔斯按照耐久性(D
)升序的顺序对布料进行排序,耐久性相同的布料按唯一标识符(U
)升序的顺序进行排序。*/
bool cmp1(const Q a,const Q b){
if(a.C!=b.C)return a.C<b.C;
return a.U<b.U;
}
bool cmp2(const Q a,const Q b){
if(a.D!=b.D)return a.D<b.D;
return a.U<b.U;
}
int main(){
cin>>T;
string C;
int D;
int U;
for(int i=0;i<T;i++){
cin>>N;
vector<Q> q1;
vector<Q> q2;
for(int j=0;j<N;j++){
cin>>C>>D>>U;
q1.push_back(Q(C,D,U));
q2.push_back(Q(C,D,U));
}
sort(q1.begin(),q1.end(),cmp1);
sort(q2.begin(),q2.end(),cmp2);
int flag=0;
for(int j=0;j<N;j++){
if(q1[j].U==q2[j].U) flag++;
}
//Case #1: 5
cout<<"Case #"<<i+1<<": "<<flag<<endl;
q1.clear();
q2.clear();
}
return 0;
}
3446. 整数奇偶排序
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>j;
vector<int>o;
bool cmp1(int a,int b){
return a>b;
}
int main(){
int x;
while(cin>>x){
if(x%2==0) o.push_back(x);
else j.push_back(x);
}
sort(j.begin(), j.end(),cmp1);
sort(o.begin(), o.end());
for(auto i:j) cout<<i<<" ";
for(auto i:o) cout<<i<<" ";
return 0;
}
3376. 成绩排序2
#include<bits/stdc++.h>
using namespace std;
class stu{
public:
int id;
int sore;
stu(int a,int s){
id=a;
sore=s;
}
};
// 比较函数
bool compare(const stu& a,const stu& b) {
if (a.sore != b.sore) {
return a.sore < b.sore; // 按成绩从低到高排序
}
return a.id < b.id; // 按xuehao从小到大排序
}
int main(){
int n;
cin>>n;
vector<stu>student;
for(int i=0;i<n;i++){
int a;
int s;
cin>>a>>s;
student.push_back(stu(a, s));
}
//stu ss("qhie",12,34);
sort(student.begin(), student.end(),compare);
for (const auto& students : student) {
cout << students.id << " " << students.sore << endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int flag=0;
class stu{
public:
string name;
int sore;
int xx;
stu(string a,int s,int x){
name=a;
sore=s;
xx=x;
}
};
//第二行包含一个整数 0或 1,表示排序规则,0 表示从高到低,1表示从低到高。
// 比较函数
bool compare0(const stu& a,const stu& b) {
if (a.sore != b.sore) {
return a.sore > b.sore;
}
return a.xx < b.xx; // 按照顺序
}
// 比较函数
bool compare1(const stu& a,const stu& b) {
if (a.sore != b.sore) {
return a.sore < b.sore; // 按成绩从低到高排序
}
return a.xx < b.xx; // 按照顺序
}
int main(){
int n,m;
cin>>n>>m;
vector<stu>student;
for(int i=0;i<n;i++){
string a;
int s;
cin>>a>>s;
student.push_back(stu(a, s,flag));
flag++;
}
//stu ss("qhie",12,34);
if(m==0) sort(student.begin(), student.end(),compare0);
if(m==1) sort(student.begin(), student.end(),compare1);
for (const auto& students : student) {
cout << students.name << " " << students.sore << endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
set<int>x;
int n;
cin>>n;
int xx;
for(int i=0;i<n;i++){
cin>>xx;
x.insert(xx);
}
for(auto i:x) cout<<i<<" ";
cout<<endl;
return 0;
}
堆排序还是插入排序
/*插入排序
本质:看当前元素是否比前驱小,若小,则插到前面有序序列中。插入排序的前半部分都是有序的
后半部分是原序。所以说,b数组前半部分是有序的,无序部分应该和a中顺序是一样的
堆排序
堆是前面无序,后面有序,是>= 堆顶的元素。
所以只需从后往前看,找到< 堆顶的元素,就是分界线。然后将堆顶与堆底互换,
下坠(重新对堆排序)的同时删去堆底,堆底就在有序的序列中了。
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N], b[N];
int n;
void down(int u, int size) //大根堆的下坠
{
int t = u; //保存最大节点
if (u*2 <= size && b[u*2] > b[t]) t = u*2; //若左孩子存在且最大,更新t
if (u*2+1 <= size && b[u*2+1] > b[t]) t = u*2+1; //右孩子存在且最大,更新t
if (t != u)
{
swap(b[u], b[t]);
down(t, size);
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
//从第二个元素开始,先判断是否为插入排序
//前面是从小到大的有序序列,后面则无序
int p = 2;
while (p <= n && b[p] >= b[p-1]){ //判断前面是否有序
p++;
}
int k = p; //记录p走到哪了,k 就是无序的第一个元素
while (p <= n && a[p] == b[p]){ //判断后面是否为原序
p++;
}
if (p == n+1) //若整个走完就是插入排序
{
puts("Insertion Sort");
//执行一次插入排序,只需要将b[k]插到前面的有序序列中
int kk=b[k];
for(int i=k-1;i>=1;i--){
if(kk<b[i]){
b[i+1]=b[i];
}
else {
b[i+1]=kk;
break;
}
}
/* while (k > 1 && b[k] < b[k-1]) //当至少有一个元素存在时
swap(b[k-1], b[k]), k--; */
}
else //否则为堆排序
{
puts("Heap Sort");
//从末尾出发,找到堆底
k = n;
while (k >= 1 && b[k] >= b[1]) k--;
swap(b[k], b[1]); //交换堆顶,堆底
down(1, k-1); //下坠,并删去堆底
}
for (int i = 1; i <= n; i++) cout << b[i]<<" ";
return 0;
}
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
bool Compare(char a, char b) {
return tolower(a) < tolower(b);
}
int main(){
string s;
int i=0;
while(getline(cin, s)){
string str;
for(i=0;i<s.length();i++){
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){
str+=s[i];
}
}
stable_sort(str.begin(),str.end(),Compare);
int k=0;
for(i=0;i<s.length();i++){
if(isalpha(s[i])) {
cout<<str[k++];
}
else {
cout<<s[i];
}
} cout << endl;
}
return 0;
}