1. 程式人生 > >關於排序速度效率陣列集合選擇那點事

關於排序速度效率陣列集合選擇那點事

題目連結
今天在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。。