ACM学习笔记DAY3

ACM学习笔记DAY3

今天学习的主要内容为排序

  1. 插入排序
#include<iostream>
#include<cstdio>
using namespace std;
void insort(int s[], int n)
{
	int i, j;
	for (i = 2; i <= n; i++)
	{
		s[0] = s[i];
		j = i - 1;
		while (s[0] < s[j])
		{
			s[j + 1] = s[j];
			j--;
		}
		s[j + 1] = s[0];
	}
}
int main() {
	int a[11];
	for (int i = 1; i < 11; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i < 11; i++)
	{
		cout << a[i]<<" ";//原始顺序
	}
	cout << endl;
	insort(a, 10);
	for (int i = 1; i < 11; i++)
	{
		cout << a[i]<<" ";
	}
}
  1. 希尔排序
#include<iostream>
using namespace std;
void shsort(int s[], int n)
{
	int i, j, d;
	d = n / 2;
	while (d >= 1)
	{
		for (i = d + 1; i <= n; i++)
		{
			s[0] = s[i];
			j = i - d;
			while ((j > 0) && (s[0] < s[j]))
			{
				s[j + d] = s[j];
				j = j - d;
			}
			s[j + d] = s[0];
		}
		d /= 2;
	}
}
int main() {
	int a[11];
	for (int i = 1; i < 11; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << " ";//原始顺序
	}
	cout << endl;
	shsort(a, 10);
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << " ";
	}
}
  1. 快速排序
#include<iostream>
using namespace std;
void qusort(int s[], int start,int end)
{
	int i, j;
	i = start;
	j = end;
	s[0] = s[start];
	while (i < j)
	{
		while (i < j && s[0] < s[j])
			j--;
		if (i < j)
		{
			s[i] = s[j];
			i++;
		}
		while (i < j && s[i] <= s[0])
			i++;
		if (i < j)
		{
			s[j] = s[i];
			j--;
		}
	}
	s[i] = s[0];
	if (start < i)
		qusort(s, start, j - 1);
	if (i < end)
		qusort(s, j + 1, end);
}
int main() {
	int a[11];
	for (int i = 1; i < 11; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << " ";//原始顺序
	}
	cout << endl;
	qusort(a, 1, 10);
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << " ";
	}
}
  1. 归并排序
#include<iostream>
using namespace std;
void merge(int r[], int s[], int x1, int x2, int x3)
{               
	int i, j, k;
	i = x1;
	j = x2 + 1;
	k = x1;
	while ((i <= x2) && (j <= x3))
	{
		if (r[i] <= r[j])
		{
			s[k] = r[i];
			i++;
			k++;
		}
		else
		{
			s[k] = r[j];   
			j++;
			k++;
		}
	}
	while (i <= x2)            
		s[k++] = r[i++];
	while (j <= x3)
		s[k++] = r[j++];
}
void merge_sort(int r[], int s[], int m, int n)
{
	int p;
	int t[20];
	if (m == n)
		s[m] = r[m];
	else
	{
		p = (m + n) / 2;
		merge_sort(r, t, m, p);
		merge_sort(r, t, p+1, n);
		merge(t, s, m, p, n);
	}
}
int main() {
	int a[11];
	for (int i = 1; i < 11; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << " ";//原始顺序
	}
	cout << endl;
	merge_sort(a, a, 1, 10);
	for (int i = 1; i < 11; i++)
	{
		cout << a[i] << " ";
	}
}
  1. 堆排序的话以后再补充

以下是今天在vj上面没有ac的题目在这里插入图片描述
在这里插入图片描述
这道题由于当时没有用归并而是直接用循环写的导致一直超时,下面附上题解代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=500000+5;  
long long ans;
int a[maxn],ar[maxn];
void megre(int a[],int l,int mid,int r){
 int i=l,j=mid+1;
 int k=l;
 while(i<=mid&&j<=r){//合并为一个数组,小的数放在临时数组的前面
  if(a[i]>=a[j]){
   ar[k++]=a[j++];
   ans+=mid+1-i;
  }
  else{
   ar[k++]=a[i++];
  }
 }
 while(i<=mid){//如果前面那个whie是以j>r结束时,说明左边的数组没有全部录入临时数组
  ar[k++]=a[i++];
 } 
 while(j<=r){//如果前面那个whie是以i>mid结束时,说明右边的数组没有全部录入临时数组
  ar[k++]=a[j++];
 } 
 for(int i=l;i<=r;i++){//把临时数组录入数组a排序完成(部分或全部)
  a[i]=ar[i];
 }
}
void msort(int a[],int l,int r){//递归到一个数据为一组
 if(l>=r){
  return ;
 }
 int mid = (l+r)/2;
 msort(a,l,mid);
 msort(a,mid+1,r);
 megre(a,l,mid,r);
}
int main() {
 int n;
 while(cin>>n&&n){
  ans=0;
  memset(ar,0,sizeof(ar));
  for(int i=1;i<=n;i++){
   cin>>a[i];
  }
  msort(a,1,n)printf("%lld\n",ans);
 }
 return 0;
}

这道题满满的细节导致一直没有ac,下面附上题解
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct A1
{
    int TEAM,ToW[21],wrong[21],time,T;
} team[1002];
struct A2
{
    int team,problem,time,TF;
} in[1008];
bool compare1(A2 a,A2 b);
bool compare2(A1 a,A1 b);
int main()
{
    int n,m;
    while(cin>>m>>n!=NULL)
    {
        memset(team,0,sizeof(team));
        for(int i=1; i<=m; i++)
            team[i].TEAM=i;
        for(int i=0; i<n; i++)
            cin>>in[i].team>>in[i].problem>>in[i].time>>in[i].TF;
        sort(in,in+n,compare1);
        for(int i=0; i<n; i++)
            if(team[in[i].team].ToW[in[i].problem]==0)
                if(in[i].TF==0)
                    team[in[i].team].wrong[in[i].problem]++;
                else
                {
                    team[in[i].team].ToW[in[i].problem]=1;
                    team[in[i].team].T++;
                    team[in[i].team].time+=team[in[i].team].wrong[in[i].problem]*1200+in[i].time;
                }
        sort(team+1,team+m+1,compare2);
        cout<<team[1].TEAM;
        for(int i=2; i<=m; i++)
            cout<<' '<<team[i].TEAM;
        cout<<endl;
    }
    return 0;
}
bool compare1(A2 a,A2 b)
{
    return a.time<b.time;
}
bool compare2(A1 a,A1 b)
{
    if(a.T!=b.T)
        return a.T>b.T;
    if(a.time!=b.time)
        return a.time<b.time;
    return a.TEAM<b.TEAM;
}

-7.8 共勉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值