代码效率比较
  • 板块学术版
  • 楼主clo201111
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/8/30 20:44
  • 上次更新2025/8/31 02:54:41
查看原帖
代码效率比较
1123752
clo201111楼主2025/8/30 20:44

有谁能说说哪一份代码更快:

#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);
}

2025/8/30 20:44
加载中...