A
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
map<string,int>p;
set<string>q;
const int N=1e7+10;
const int inf=0x3f3f3f3f;
int a[N];
void one_ksort(int l,int r)
{
int i=l,j=r,x=a[l];
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;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
one_ksort(0,n-1);
for(int i=0;i<n;i++)
{
if(i==n-1)
{
printf("%d\n",a[i]);
}
else
{
printf("%d ",a[i]);
}
}
}
return 0;
}
B - 数据结构实验之排序二:交换排序
注意:数据相等时不做交换
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
map<string,int>p;
set<string>q;
const int N=1e7+10;
const int inf=0x3f3f3f3f;
int b[N];
int a[N];
int sum1,sum2;
void ksort(int l,int r)
{
int i=l,j=r,x=a[l];
if(l>r)
{
return;
}
while(i<j)
{
while(i<j&&a[j]>=x)
{
j--;
}
if(a[i]!=a[j])
{
sum1++;
}
a[i]=a[j];
while(i<j&&a[i]<=x)
{
i++;
}
if(a[j]!=a[i])
{
sum1++;
}
a[j]=a[i];
}
a[i]=x;
ksort(l,i-1);
ksort(i+1,r);
}
void maopao(int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(b[j]>b[j+1])
{
sum2++;
int t=b[j+1];
b[j+1]=b[j];
b[j]=t;
}
}
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sum1=sum2=0;
ksort(0,n-1);
maopao(n);
printf("%d %d\n",sum2,sum1);
}
return 0;
}
C - 数据结构实验之排序三:bucket sort
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
map<string,int>p;
set<string>q;
const int N=1e7+10;
const int inf=0x3f3f3f3f;
int b[N];
int a[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
if(x<100)
{
a[x]++;
}
else
{
a[100]++;
}
}
for(int i=0;i<=100;i++)
{
if(a[i]!=0)
{
printf("%d %d\n",i,a[i]);
}
}
return 0;
}
D - 数据结构实验之排序四:寻找大富翁
请用堆排序完成。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
map<string,int>p;
set<string>q;
const int N=1e7+10;
const int inf=0x3f3f3f3f;
int b[N];
int a[N];
int n;
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int top=0;
int x;
for(int i=0; i<n; i++)
{
scanf("%d",&x);
if(top==0)
{
a[top]=x;
top++;
}
else
{
if(top<m)
{
for(int j=0; j<top; j++)
{
if(x>a[j])
{
int k=top;
while(k>j)
{
a[k]=a[k-1];
k--;
}
a[j]=x;
top++;
break;
}
}
}
else
{
for(int j=0; j<m; j++)
{
if(x>a[j])
{
int k=m;
while(k>j)
{
a[k]=a[k-1];
k--;
}
a[j]=x;
top++;
break;
}
}
}
}
}
if(m>n)
{
for(int i=0;i<n;i++)
{
if(i==n-1)
{
printf("%d\n",a[i]);
}
else
{
printf("%d ",a[i]);
}
}
}
else
{
for(int i=0;i<m;i++)
{
if(i==m-1)
{
printf("%d\n",a[i]);
}
else
{
printf("%d ",a[i]);
}
}
}
return 0;
}
E - 数据结构实验之排序五:归并求逆序数
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
int b[N];
long long ant;
void Merge(int low,int mid,int hight)
{
int i=low;
int j=mid+1;
int k=0;
while(i<mid+1&&j<=hight)
{
if(a[i]<=a[j])
{
b[k++]=a[i++];
}
else
{
b[k++]=a[j++],ant+=(mid-i+1);
}
}
while(i<=mid)
{
b[k++]=a[i++];
}
while(j<=hight)
{
b[k++]=a[j++];
}
for(int i=0;i<k;i++)
{
a[i+low]=b[i];
}
}
void Gsort(int low,int hight)
{
if(low<hight)
{
int mid=(low+hight)>>1;
Gsort(low,mid);
Gsort(mid+1,hight);
Merge(low,mid,hight);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
Gsort(0,n-1);
cout<<ant<<endl;
return 0;
}
F - 数据结构实验之排序六:希尔排序
Hint
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
map<string,int>p;
set<string>q;
const int N=1e7+10;
const int inf=0x3f3f3f3f;
int b[N];
int a[N];
int n;
void shell_sort(int dk)
{
int t=0;
int j;
for(int i=dk;i<n;i++)
{
t=a[i];
for(j=i;j>=dk&&a[j-dk]>t;j=j-dk)
{
a[j]=a[j-dk];
}
a[j]=t;
}
for(int i=0;i<n;i++)
{
if(i==n-1)
{
printf("%d\n",a[i]);
}
else
{
printf("%d ",a[i]);
}
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
shell_sort(n/2);
shell_sort(1);
}
return 0;
}
G - 数据结构实验之排序七:选课名单
Output
Hint
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct node
{
string name[1010];
}s[2020];
int main()
{
int n,m,k,x;
int num[2020]={0};
string str;
scanf("%d %d",&n,&m);
getchar();
while(n--)
{
cin>>str;
cin>>k;
while(k--)
{
cin>>x;
s[x].name[num[x]++]=str;
}
}
for(int i=1;i<=m;i++)
{
cout<<i<<" "<<num[i]<<endl;
sort(s[i].name,s[i].name+num[i]);
for(int j=0;j<num[i];j++)
{
cout<<s[i].name[j]<<endl;
}
}
return 0;
}
H - 找女朋友
Descriptio
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;
int a[1000010];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
for(int i=0; i<n; i++)
{
if(i==n-1)
{
printf("%d\n",a[i]);
}
else
{
printf("%d ",a[i]);
}
}
return 0;
}
I - 交叉排序
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
int a[105];
int n, t;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n - 1; i += 2)
{
for(int j = 1; j <= n - i - 1; j += 2)
{
if(a[j] > a[j + 2])
{
t = a[j];
a[j] = a[j + 2];
a[j + 2] = t;
}
}
}
for(int i = 2; i <= n - 1; i += 2)
{
for(int j = 2; j <= n - i; j += 2)//
{
if(a[j] < a[j + 2])
{
t = a[j];
a[j] = a[j + 2];
a[j + 2] = t;
}
}
}
for(int i = 1; i < n; i++)
cout << a[i] << " ";
cout << a[n] << endl;
}
J - 超排序
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[1000010];
while(~scanf("%s",a))
{
int b[150]= {0};
int n=strlen(a);
for(int i=0; i<n; i++)
{
b[a[i]]++;
}
int k=0;
for(int i='A'; i<='Z'; i++)
{
for(int j=0; j<b[i]; j++)
{
a[k++]=i;
}
}
for(int i='a'; i<='z'; i++)
{
for(int j=0; j<b[i]; j++)
{
a[k++]=i;
}
}
for(int i=0; i<k; i++)
{
printf("%c",a[i]);
}
printf("\n");
}
return 0;
}
K - 十日游戏
#include <iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#define ll long long
#define inf 0x3f3f3f3f
const int N = 1e6 + 10;
using namespace std;
struct node
{
int a,b;
int sum;
bool operator<(const node other)const
{ //在优先队列中实现自定义排序
return sum<other.sum;
}
};
bool cmp(int aa,int bb)//对俩数组排序
{
return aa>bb;
}
int a[N],b[N];
priority_queue<node>que;
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=0; i<n; i++)cin>>b[i];
sort(a,a+n,cmp);
sort(b,b+n,cmp);
for(int i=0; i<n; i++)//先让一个数列和另一个数列的最大分别加和
{ //然后加入优先队列
node now;
now.a=i; //储存a这个数列中第几大的数
now.b=0; //和b数列的最大相加
now.sum=a[i]+b[0];
que.push(now);
}
for(int i=0; i<n; i++)
{
node now=que.top(); //取出最大的
que.pop();
if(i!=n-1) //控制输出,for循环就循环n次
{
cout<<now.sum<<" ";
}
else cout<<now.sum<<endl;
now.b++; //让目前这个第num.a大的a数组和它加的b数组中第now.b大的数中的下一个相加
now.sum=a[now.a]+b[now.b];
que.push(now);//然后加入队列
}
return 0;
}