ACM学习笔记DAY3
今天学习的主要内容为排序
- 插入排序
#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]<<" ";
}
}
- 希尔排序
#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] << " ";
}
}
- 快速排序
#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] << " ";
}
}
- 归并排序
#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] << " ";
}
}
- 堆排序的话以后再补充
以下是今天在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 共勉