数据结构----排序(3)

1、基数排序

复制代码
#include <iostream>
using namespace std;
 
const int N = 105;
 
struct node {
    int len;
    int data[N];
};
 
int a[N];
int n, k = 0;
 
void map_sort() {
    node t[11];
    
    // 初始化所有桶的长度为0
    for(int i = 0; i < 10; i++) {  // 修正:桶索引应为0-9
        t[i].len = 0;
    }
    
    int maxn = -1e9;
    for(int i = 1; i <= n; i++) {
        if(a[i] > maxn) {
            maxn = a[i];
        }
    }
    
    int num = 1;
    while(maxn > 0) {
        k++;
        
        // 将元素分配到对应的桶中
        for(int i = 1; i <= n; i++) {
            int d = (a[i] / num) % 10;  // 修正:避免变量名冲突
            t[d].data[t[d].len++] = a[i];
        }
        
        num *= 10;
        maxn /= 10;
        
        // 从桶中收集元素
        int m = 1;
        for(int i = 0; i < 10; i++) {  // 修正:桶索引应为0-9
            for(int j = 0; j < t[i].len; j++) {  // 修正:数组索引从0开始
                a[m++] = t[i].data[j];
            }
            t[i].len = 0;  // 清空桶
        }
        
        // 输出每一轮的结果
        if(k<3){
        	for(int i=1;i<=n;i++){
        		cout<<a[i]<<" ";
			}
			cout<<"\n";
		}
		else if(k==3){
			for(int i=1;i<=n;i++){
				cout<<a[i]<<" ";
			}
		}
    }
}
 
int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    map_sort();
    return 0;
}

2、统计工龄

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int a[N];
int n,m;
int main() {
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>m;
		a[m]++;
	}
	for(int i=0;i<=50;i++){
		if(a[i]){
			cout<<i<<":"<<a[i]<<endl;
		}
	}
	return 0;
}

3、PAT排名汇总

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
struct node{
    string num;  // 考生的学号
    int score;
    int pm1;     // 总排名
    int bh;      // 考点编号
    int pm2;     // 考点内排名
}b[N],a[N];
int n;
 
bool cmp(node u,node v){
    if(u.score==v.score){
        return u.num<v.num;
    }
    else{
        return u.score>v.score;
    }
}
 
int main(){
    cin>>n;
    int cnt=0;  // 总考生数
    
    // 处理每个考点
    for(int i=1;i<=n;i++){
        int m;
        cin>>m;
        
        // 读取当前考点的考生信息
        for(int j=1;j<=m;j++){
            cin>>a[j].num>>a[j].score;
            a[j].bh=i;  // 记录考点编号
        }
        
        // 考点内排序
        sort(a+1,a+1+m,cmp);
        
        // 计算考点内排名
        a[1].pm2 = 1;  // 初始化第一个考生的排名
        for(int j=2;j<=m;j++){
            if(a[j].score==a[j-1].score){
                a[j].pm2=a[j-1].pm2;  // 分数相同,排名相同
            }
            else{
                a[j].pm2=j;  // 分数不同,排名为当前位置
            }
        }
        
        // 将当前考点的考生加入总列表
        for(int j=1;j<=m;j++){
            b[++cnt]=a[j];  // 使用前置++确保p从1开始
        }
    }
    
    // 全局排序
    sort(b+1,b+cnt+1,cmp);
    
    // 计算总排名
    b[1].pm1 = 1;  // 初始化第一个考生的总排名
    for(int i=2;i<=cnt;i++){
        if(b[i].score==b[i-1].score){
            b[i].pm1=b[i-1].pm1;  // 分数相同,排名相同
        }
        else{
            b[i].pm1=i;  // 分数不同,排名为当前位置
        }
    }
    
    // 输出结果
    cout<<cnt<<endl;
    for(int i=1;i<=cnt;i++){
        cout<<b[i].num<<" "<<b[i].pm1<<" "<<b[i].bh<<" "<<b[i].pm2<<endl;
    }
    
    return 0;
}

4、抢红包

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
struct node{
	int num;//编号 
	int money=0;//收入金额 
	int sum=0;//抢到红包的个数 
}a[N];
int n;
bool cmp(node u,node v){
	if(u.money!=v.money){
		return u.money>v.money;
	}
	else{
		if(u.sum!=v.sum){
			return u.sum>v.sum;
		}
		else{
			return u.num<v.num;
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		a[i].num=i;
		int k;
		cin>>k;
		for(int j=1;j<=k;j++){
			int num1;//抢到红包的数量 
			double money1;//抢到红包的金额 
			
			cin>>num1>>money1;
			
			a[num1].money+=money1;
			a[num1].sum++;
			a[i].money-=money1;
		}
	}
	
	sort(a+1,a+1+n,cmp);//sort函数排序
	
	for(int i=1;i<=n;i++){
		cout<<a[i].num<<" "<<fixed<<setprecision(2)<<a[i].money/100.0<<"\n";
	} 
	
	
	return 0;
} 

5、二叉树非叶子

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{
	int value;
	int left;
	int right;
}a[N];
int n;
void xianxu(int idx){
	if(idx==0)return;
	cout<<a[idx].value<<" ";
	xianxu(a[idx].left);
	xianxu(a[idx].right);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].value>>a[i].left>>a[i].right;
	}
	
	for(int i=1;i<=n;i++){
		if(a[i].left!=0||a[i].right!=0){
			a[i].value++;
		}
	}
	xianxu(1);
	cout<<endl;
	return 0;
}

6、月饼

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
struct node{
	double kcl;
	double zsj;
	double dj;
}a[N];
int n,d;
bool cmp(node a,node b){
	return a.dj>b.dj;
}
int main(){
	cin>>n>>d;
	for(int i=1;i<=n;i++){
		cin>>a[i].kcl;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i].zsj;
		a[i].dj=a[i].zsj/a[i].kcl;
	}
	sort(a+1,a+n+1,cmp);
	double maxprice=0.0;
	for(int i=1;i<=n&&d>0;i++){
		if(a[i].kcl<=d){
			maxprice+=a[i].zsj;
			d-=a[i].kcl;
		}
		else{
			maxprice+=a[i].dj*d;
			d=0;
		}
	}
	cout<<fixed<<setprecision(2)<<maxprice<<endl;
	return 0;
}

7、寻找大富翁

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
long long a[N];
int n,m;
bool cmp(long long a,long long b){
	return a>b;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=m&&i<=n;i++){
		if(i>1)cout<<" ";
		cout<<a[i];
	}
	return 0;
}
相关推荐
码破苍穹ovo1 小时前
二分查找----1.搜索插入位置
数据结构·算法
十年编程老舅1 小时前
C/C++ 高频八股文面试题1000题(一)
c++·八股文·大厂面试题·c++八股文·八股文面试题·c++面经
烨然若神人~2 小时前
算法第38天|322.零钱兑换\139. 单词拆分
算法
Hat_man_2 小时前
Windows下memcpy_s如何在Linux下使用
linux·c++
sukalot2 小时前
window显示驱动开发—输出合并器阶段
驱动开发·算法
fei_sun2 小时前
【编译原理】语句的翻译
算法
Xの哲學3 小时前
hostapd 驱动注册机制深度分析
linux·网络·算法·wireless
liujing102329293 小时前
Day05_数据结构大项目作业20250620
数据结构
老一岁3 小时前
c++set和pair的使用
开发语言·c++
int型码农3 小时前
数据结构第八章(六)-置换选择排序和最佳归并树
java·c语言·数据结构·算法·排序算法