關於排序速度效率陣列集合選擇那點事
阿新 • • 發佈:2018-11-12
題目連結
今天在codeforces上寫一個排序題。我一直用java寫的演算法。後來太tm操蛋了。我用了普通的陣列排序,tl了。。直接矇蔽。後來想用c++看看效果,,把我的java程式碼克隆成c++。太操蛋了。。竟然和java一樣超時,,後來在冥冥中看過很多c++程式碼把大的陣列放到main函式的外面,我試了一下,竟然ac了。。390ms。。後來看了下Java有ac的程式碼,發現他使用list進行排序的。。我試了下,integer型別的list中間有一個wa用.eqauls竟然過了,我是真的無語了。竟然也能ac。才280ms。。。這差距,,,後來我把c++的輸入用scanf優化,哈哈80ms。。果然還是c++大法厲害。。
附上截圖
附上c++程式碼:
#include <iostream>
#include <math.h>
#include<algorithm>
#include <stdio.h>
using namespace std;
int a[200005];
int main()
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
if (k==0) {if(a[0]==1)cout<<-1<<endl;else cout<<1<<endl;}
else if(k==n)cout<<(a[k-1])<<endl;
else if(a[k-1]==a[k]) {cout<<-1<<endl;}
else cout<<(a[k-1])<<endl;
return 0;
}
附上java程式碼
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
// TODO 自動生成的方法存根
StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
int n=(int)in.nval;
in.nextToken();int k=(int)in.nval;
List<Integer>list=new ArrayList();
for(int i=0;i<n;i++)
{
in.nextToken();int exam=(int)in.nval;
list.add(exam);
}
list.sort(null);
if(k==0) {if(list.get(0)==1)out.println(-1);else out.println(1);}
else if(k==n)out.println(list.get(k-1));
else if(list.get(k-1).equals(list.get(k))) {out.println(-1);}
else {out.println(list.get(k-1));}
out.flush();
}
}
總結:排序題千萬不要用arrays.sort(陣列)了。要用list。。c++陣列一定要開在main函式外面。排序題一定要用c++別用Java。。