两种做法,不熟悉归并和快排的建议两个都用去做一下,不过传统快排这题有坑的要注意。最近发现用stream流做简单一些的算法题是真的爽!!!
就比如这题:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
int n = nextInt();
List<Integer> list = new ArrayList<>();
while(n-- > 0) {
list.add(nextInt());
}
list.stream().sorted().forEach(num -> out.print(num + " "));
out.close();
}
//魔法快读,不懂的小伙伴可以看看我的文章
//http://t.csdn.cn/zhS6J
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
}
传统归并:
import java.io.*;
import java.util.*;
public class Main {
static int[] b;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer st = new StreamTokenizer(br);//当然用Scanner一样的
PrintWriter pr = new PrintWriter(System.out);
st.nextToken();int n=(int)st.nval;
int[] a=new int[n+1];b=new int[n+1];
for(int i=1;i<=n;i++){
st.nextToken();
a[i]=(int)st.nval;
}
msort(a,1,n);
for(int i=1;i<=n;i++)
pr.write(a[i]+" ");
pr.flush();
}
static void msort(int[] a,int l,int r){
if(l>=r)return;
int mid=l+r>>1,i=l,j=mid+1,k=i;
msort(a,l,mid);msort(a,mid+1,r);
while(i<=mid&&j<=r){
if(a[i]<=a[j]) b[k++]=a[i++];
else b[k++]=a[j++];
}
while(i<=mid)b[k++]=a[i++];
while(j<=r)b[k++]=a[j++];
for(int z=l;z<=r;z++)
a[z]=b[z];
}
}
虽然stream流很爽,但是算法基础功扎实了以后再使用,才不会走火入魔。