有谁能说说哪一份代码更快:
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<numeric>
#include<cctype>
#include<vector>
#include<cstdbool>
#include<set>
#include<queue>
#define INF 0x3F3F3F3F
using namespace std;
int read() {
int d=0,f=1; char c;
c=getchar();
while(!isdigit(c)) {
if(c=='-')
f=-f;
c=getchar();
}
while(isdigit(c)) {
d=d*10+(c^'0');
c=getchar();
}
return d*f;
}
int n;
int a[200005],tmp[200005];
__inline int winner(int x,int y,int len) {
if(x<len)
x=tmp[x];
if(y<len)
y=tmp[y];
return tmp[x]<=tmp[y]?x:y;
}
void tournamentSort(int * arr,int len) {
static int v;
for(int i=0;i<len;i++)
tmp[i+len]=arr[i];
for(int i=len*2-1;i>1;i-=2)
tmp[i>>1]=winner(i-1,i,len);
v=tmp[tmp[1]];
tmp[tmp[1]]=INF;
for(int i=0;i<len;i++) {
arr[i]=v;
for(int j=tmp[1],g;j>1;j=j>>1) {
if(j%2)
g=j-1;
else
g=j+1;
tmp[j>>1]=winner(j,g,len);
}
v=tmp[tmp[1]];
tmp[tmp[1]]=INF;
}
}
int main() {
n=read();
for(int i=0;i<n;i++)
a[i]=read();
tournamentSort(a,n);
for(int i=0;i<n;i++)
printf("%d%c",a[i],(i==n-1?'\n':' '));
}
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<numeric>
#include<cctype>
#include<vector>
#include<cstdbool>
#include<set>
#include<queue>
#define INF 0x3F3F3F3F
using namespace std;
int read() {
int d=0,f=1; char c;
c=getchar();
while(!isdigit(c)) {
if(c=='-')
f=-f;
c=getchar();
}
while(isdigit(c)) {
d=d*10+(c^'0');
c=getchar();
}
return d*f;
}
int n,len;
int a[200005],tmp[200005];
char buffer[400005];
__inline int winner(int x,int y,int len) {
if(x<len)
x=tmp[x];
if(y<len)
y=tmp[y];
return tmp[x]<=tmp[y]?x:y;
}
__inline void createTree(int * arr,int len,int &v) {
for(int i=0;i<len;i++)
tmp[i+len]=arr[i];
for(int i=len*2-1;i>1;i-=2)
tmp[i>>1]=winner(i-1,i,len);
v=tmp[tmp[1]];
tmp[tmp[1]]=INF;
}
__inline void reconstruct(int len,int &v) {
for(int i=tmp[1],j;i>1;i=i>>1) {
if(i%2)
j=i-1;
else
j=i+1;
tmp[i>>1]=winner(i,j,len);
}
v=tmp[tmp[1]];
tmp[tmp[1]]=INF;
}
void tournamentSort(int * arr,int len) {
static int v;
createTree(arr,len,v);
for(int i=0;i<len;i++) {
arr[i]=v;
reconstruct(len,v);
}
}
int main() {
n=read();
for(int i=0;i<n;i++)
a[i]=read();
tournamentSort(a,n);
for(int i=0;i<n;i++) {
if(len+1>sizeof(buffer)) {
fwrite(buffer,1,len,stdout);
len=0;
}
len+=sprintf(&buffer[len],"%d%c",a[i],(i==n-1?'\n':' '));
}
if(len)
fwrite(buffer,1,len,stdout);
}