SDUT ACM PTA 数据结构 排序

1.统计工龄

#include <bits/stdc++.h>
using namespace std;
//读入、输出 so easy
int main() {
	int a[100005], n, x, ma = -1, i;
	cin >> n;
	for (i = 0; i < n; i++) 
	{
		cin >> x;
		a[x]++;
		ma = max(ma, x);
	}
	for (i = 0; i <= ma; i++) 
	{
		if (a[i] != 0)
			cout << i << ":" << a[i] << endl;
	}
	return 0;
}

2.寻找大富翁

#include <bits/stdc++.h>
using namespace std;
//读入、排序、输出
int main() 
{
	list<int> l;
	int n, m, x;
	cin >> n>>m;
	while (n--) 
	{
		cin >> x;
		l.push_back(x);
	}
	l.sort();
	l.reverse();
	int i = 0;
	list<int>::iterator it;
	for (it = l.begin(); it != l.end(); it++) 
	{
		if (i < m) {
			if (i)
				cout << " ";
			cout << *it;
			i++;
		}
	}
	return 0;
}

3.点赞狂魔

#include <bits/stdc++.h>
using namespace std;

struct people 
{
	string name;
	int len, num;
} a[105];

bool cmp(people a, people b) 
{
	if (a.num != b.num)
		return a.num > b.num;
	else
		return a.len < b.len;
}

int main() {
	int n, m, x;
	cin >> n;
	for (int i = 0; i < n; i++) 
	{//每个人都依次读入
		set<int> st;//set去重
		cin >> a[i].name >> a[i].len;
		for (int j = 0; j < a[i].len; j++) 
		{
			cin >> x;
			st.insert(x);
		}
		a[i].num = st.size();
	}
	sort(a, a + n, cmp);
	for (int i = 0; i < 3; i++) 
	{//遍历输出
		if (i)
			cout << " ";
		if (i < n)
			cout << a[i].name;
		else
			cout << "-";
	}
	return 0;
}

4.插入排序还是归并排序

#include <bits/stdc++.h>
using namespace std;
int main() 
{
	int n,x,k;
	cin>>n;
	int a[105],b[105];
	for(int i=0;i<n;i++)cin>>a[i];//读入第一个序列
	for(int i=0;i<n;i++)cin>>b[i];//读入第二个序列
	int i,j;
	//第一种情况:
	//如果前面都是递增,后面的和第一个序列一样,那就是插入排序
	for(i=0;i<n&&b[i]<=b[i+1];i++);
	for(j=i+1;j<n&&b[j]==a[j];j++);
	if(j==n)
	{
		cout << "Insertion Sort" << endl;
		sort(a,a+i+2);
	}
	//否则就是归并排序
	else
	{
		cout << "Merge Sort" << endl;
		int k=1,flag=1;
		while(flag)
		{//排序直到和第二序列一样并且再排序一次
			flag=0;
			for(i=0;i<n;i++)
				if(a[i]!=b[i])
					flag=1;
			k=k<<1;//左移  就是将二进制的每一个数都往左移动一位,高位舍去,低位补0
			for(i=0;i<n/k;i++) sort(a+i*k,a+(i+1)*k);
			sort(a+n/k*k,a+n);
		}
	}
	for(i=0;i<n;i++)
	{
		if(i) cout << " ";
		cout << a[i] ;
	}
	return 0;
}

5.逆序对

//和逆序对的数量一样
//归并排序及求逆序对
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int a[N] ,b[N];//b为辅助数组
long long int cnt=0;
void merge_sort(int l , int r)
{
    if(r>l)//如果整个区间中元素个数大于1,则继续分割
    {
        int mid = (l+r) / 2 ;
        int i = l; //辅助数组的下标
        int p = l , q = mid+1;
        merge_sort(l , mid);
        merge_sort(mid+1 , r);
        while(p<=mid||q<=r)//左右两部分只要有一部分不为空
        {
            if(q>r ||(p<=mid&&a[p]<=a[q]))  b[i++] = a[p++];//从左半数组复制到辅助数组
            else
            {
                b[i++] = a[q++];
                cnt += mid -p +1;//将逆序对的个数累加起来
            }
        }
        for(i = l ; i <= r; i++)  a[i] = b[i];//将b中排好序的元素复制到a中
    }
}
int main()
{
    int n;
    cin >> n;
    for(int i = 1 ; i <= n; i ++)cin >> a[i];
    merge_sort(1 , n);
    cout <<cnt<<endl;
    return 0;
}

6.堆排序

#include<bits/stdc++.h>
using namespace std;
int a[10005],n;
//建议看看网课
void adjust(int s,int m)  //筛选
{
	int x=a[s];
	for(int j=2*s;j<=m;j*=2)
	{
		if(j<m&&a[j]<a[j+1]) j++;
		if(x<a[j])
		{
			a[s]=a[j];
			s=j;
		}
		
	}
	a[s]=x;
}
void creat()
{
	for(int i=n/2;i>0;i--)	adjust(i,n);
}
void heap_sort()
{
	creat();
	for(int i=n;i>1;i--)
	{
		swap(a[1],a[i]);
		adjust(1,i-1);
		//cout
		for(int i=1;i<=n;i++)
		{
			if(i!=1) cout<<" ";
			cout<<a[i];
		}
		cout<<endl;
	}
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=1;i<=n;i++)cin>>a[i];
		heap_sort();
	}
	return 0;
}

7.快速排序

#include <bits/stdc++.h>
using namespace std;
int a[100005],n;
//建议看看网课
void quick_sort(int l,int r)
{
	if(l<r)
	{
		int x=a[l],i=l,j=r;
		while(i<j)
		{
			while(i<j&&a[j]>=x) j--;
			a[i]=a[j];
			while(i<j&&a[i]<=x) i++;
			a[j]=a[i];
		}
		a[i]=x;
		cout<<a[1];
		for(int i=2;i<=n;i++) cout<<" "<<a[i];
		cout<<endl;
		quick_sort(l,i-1);//递归排序左半
		quick_sort(i+1,r);//递归排序右半
	}
}
int main() {
	while(cin>>n)
	{
		for(int i=1;i<=n;i++)	cin>>a[i];
		quick_sort(1,n);
	}
	return 0;
}

8.归并排序

//题目没特殊要求直接排序输出
#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	cin>>n;
	list<int> l;
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		l.push_back(x);
	}
	l.sort();
	list<int>::iterator it=l.begin();
	for(;it!=l.end();it++)
	{
		cout<<*it<<" ";
	}
	return 0;
}

9.逆序对的数量

//归并排序及求逆序对
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int a[N] ,b[N];//b为辅助数组
long long int cnt=0;
void merge_sort(int l , int r)
{
    if(r>l)//如果整个区间中元素个数大于1,则继续分割
    {
        int mid = (l+r) / 2 ;
        int i = l; //辅助数组的下标
        int p = l , q = mid+1;
        merge_sort(l , mid);
        merge_sort(mid+1 , r);
        while(p<=mid||q<=r)//左右两部分只要有一部分不为空
        {
            if(q>r ||(p<=mid&&a[p]<=a[q]))  b[i++] = a[p++];//从左半数组复制到辅助数组
            else
            {
                b[i++] = a[q++];
                cnt += mid -p +1;//将逆序对的个数累加起来
            }
        }
        for(i = l ; i <= r; i++)  a[i] = b[i];//将b中排好序的元素复制到a中
    }
}
int main()
{
    int n;
    cin >> n;
    for(int i = 1 ; i <= n; i ++)cin >> a[i];
    merge_sort(1 , n);
    cout <<cnt<<endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main() 
{
	int n, k;
	while (scanf("%d %d", &n, &k) != EOF) 
    {
		int a[n] = {0};
		for (int i = 0; i < n; i++) 
        {
			scanf("%d",&a[i]);
		}
		sort(a, a + n);
		printf("%d\n",a[k-1]);
	}
}

不懂得可以私信我,随时解答。
程序有错误请私信我,以及时改正。感谢!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值