程序设计实践--排序(1)

1、插入排序(一个数组)

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		int v=a[i];
		int j=i-1;
		while(j>=1&&a[j]>v){
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=v;
		printf("第%d轮插入排序的结果为",i);
		
		for(int k=1;k<=n;k++){
			printf(" %d",a[k]);
		}
		printf("\n");
	}
	return 0;
}

2、插入排序(两个数组)

#include<bits/stdc++.h>
using namespace std;
int n;
int a[15];//原数组
int b[15];//新数组
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int len=0;//新数组的当前长度
	
	for(int i=1;i<=n;i++){
		int v=a[i];
		int j=len-1;
		
		while(j>=0&&b[j]>v){
			b[j+1]=b[j];
			j--;
		}
		b[j+1]=v;
		len++;
		
		printf("第%d轮插入排序的结果为",i);
		for(int k=0;k<len;k++){
			printf(" %d",b[k]);
		}
		cout<<endl;
	}
	
	return 0;
}

3、堆排序

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;
void display2(int s){
	for(int i=0;i<n;i++){
		if(i==n-1){
			cout<<a[i]<<endl;
		}
		else{
			cout<<a[i]<<" ";
		}
	}
}
void display3(int u,int v){
	int lar=u;
	int left=2*u+1;
	int right=2*u+2;
	
	if(left<v&&a[left]>a[lar]){
		lar=left;
	}
	if(right<v&&a[right]>a[lar]){
		lar=right;
	}
	if(lar!=u){
		swap(a[u],a[lar]);
		display3(lar,v);
	}
}
void display1(){
	for(int i=n/2-1;i>=0;i--){
		display3(i,n);
	}
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	
	//构建初始堆
	display1();
	display2(n);
	
	for(int i=n-1;i>0;i--){
		swap(a[0],a[i]);
		display3(0,i);
		display2(n);
	}
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;

// 调整以i为根的子树为最大堆(索引从1开始)
void disheap(int i, int n) {
    int left = 2 * i;     // 左子节点
    int right = 2 * i + 1;  // 右子节点
    int max = i;      // 最大值索引
    
    
    if(i<=n/2){
    	// 找出i、left、right中的最大值
    	if (left <= n && a[left] > a[max]) {
            max = left;
        }
        if (right <= n && a[right] > a[max]) {
            max = right;
        }
    
        // 如果最大值不是i,则交换并继续调整
        if (max!= i) {
            swap(a[i], a[max]);
            disheap(max, n);  // 递归调整被交换的子树
        }
	} 
}

// 构建初始最大堆并输出
void BuildHeap(int n) {
	int i;
    for (int i = n/2; i >= 1; i--) {
        disheap(i, n);
    }
    
    // 输出初始最大堆
    for (int j = 1; j <= n; j++) {
        cout<<a[j]<<" ";
    }
    cout << endl;
}

// 堆排序主函数
void display(int n) {
	int i;
    BuildHeap(n);  // 构建初始最大堆并输出
    
    for (int i = n; i >= 2; i--) {
        swap(a[1], a[i]);       // 将当前最大值移到末尾
        disheap(1, i-1);        // 调整剩余元素为最大堆
         
        // 输出当前数组状态
        for (int j = 1; j <= n; j++) {
            cout<<a[j]<<" ";
        }
        cout << endl;
    }
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    display(n);
    return 0;
}

4、排序(快速排序算法)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n,m;
void QuickSort(int s,int t){
	int i=s,j=t;
	int tmp=a[(i+j)/2];
	
	while(i<=j){
		while(a[j]>tmp)j--;
		while(a[i]<tmp)i++;
		if(i<=j){
			swap(a[i],a[j]);
			i++,j--;
		}
	}
	if(s<j)QuickSort(s,j);
	if(i<t)QuickSort(i,t);
}
int main(){
	cin>>m;
	while(m--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		QuickSort(1,n);
		for(int i=1;i<=n;i++){
			cout<<a[i]<<" ";
		}
		cout<<endl;
	}
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n, m;

// 随机选择基准值并分区
int Position(int s, int t) {
	// 随机选择一个位置与s交换
	srand(time(NULL));
	int pos = s + rand() % (t - s + 1);
	swap(a[s], a[pos]);
	
	int i = s, j = t;
	int tmp = a[s];
	
	while (i < j) {
		while (j > i && a[j] > tmp) j--;
		a[i] = a[j];
		while (i < j && a[i] < tmp) i++;
		a[j] = a[i];
	}
	a[i] = tmp;
	return i;
}

// 快速排序主函数
void QuickSort(int s, int t) {
	if (s < t) {
		int i = Position(s, t);
		QuickSort(s, i-1);
		QuickSort(i+1, t);
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> m;
		for (int j = 1; j <= m; j++) {
			cin >> a[j];
		}
		QuickSort(1, m);
		for (int j = 1; j <= m; j++) {
			cout << a[j] << " ";
		}
		cout << endl;
	}
	return 0;
}

5、幂(东莞2014初赛第3题)

#include<bits/stdc++.h>
using namespace std;
int a[50];
int k;
int n;
int main(){
	cin>>n;
	while(n){
		a[k]=n%2;
		n=n/2;
		k++;
	}
	k=k-1;
	
	for(int i=k;i>=0;i--){
		if(a[i]){
			cout<<2<<" "<<i<<"\n";
		}
	}
	return 0;
}

6、朗读比赛(东莞2010第2题)

#include<bits/stdc++.h>
using namespace std;
int n,s,t,r;
int main() {
	cin>>n;//s是速度,t是朗读时间,r是休息时间
	cin>>s>>t>>r;
	
	int a=s*t;
	int b=t+r;
	
	int c=n/a;
	int d=n%a;
	
	int e=c*b;
	
	
	if(d>0){
		int f=(d+s-1)/s;
		e+=f;
	}
	else{
		e-=r;
	}
	cout<<e<<endl;
	
	
	return 0;
}

7、归并排序

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int b[N];  // 临时数组,用于合并
int n;

// 合并两个有序子数组
void Merge(int le, int ri, int mid) {
	int i = le, j = mid + 1;
	int k = le;
	
	// 比较两个子数组的元素,按顺序放入临时数组b
	while (i <= mid && j <= ri) {
		if (a[i] < a[j]) {
			b[k++] = a[i++];
		} else {
			b[k++] = a[j++];
		}
	}
	
	// 处理剩余元素
	while (i <= mid) b[k++] = a[i++];
	while (j <= ri) b[k++] = a[j++];
	
	// 将临时数组b中的有序元素复制回原数组a
	for (int i = le; i <= ri; i++) {
		a[i] = b[i];
	}
}

// 归并排序主函数
void MergeSort(int le, int ri) {
	if (le < ri) {
		int mid = (le + ri) / 2;
		MergeSort(le, mid);      // 递归排序左半部分
		MergeSort(mid + 1, ri);  // 递归排序右半部分
		Merge(le, ri, mid);      // 合并两个有序部分
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	
	MergeSort(1, n);
	
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	cout << endl;
	
	return 0;
}

8、统计工龄

#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;
}

10、分数线划定

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct node{
	int num;
	int score;
}a[N];
int n,m;
int cmp(node a,node b){
	if(a.score==b.score){
		return a.num<b.num;
	}
	else{
		return a.score>b.score;
	}
}
int main(){
	cin>>n>>m;
	int l;
	for(int i=1;i<=n;i++){
		cin>>a[i].num>>a[i].score;
	}
	l=m*1.5;
	
	sort(a+1,a+1+n,cmp);
	
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(a[i].score>=a[l].score){
			cnt++;
		}
	}
	cout<<a[l].score<<" "<<cnt<<"\n";
	for(int i=1;i<=cnt;i++){
		cout<<a[i].num<<" "<<a[i].score<<"\n";
	}
	return 0;
}

11、基数排序

#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;
}

12、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;
}

13、抢红包

#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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值