Java的Arrays.sort()良心总结
C語言的stilib.h頭文件中有qsort(),C++的STL庫中有sort(),這些封裝好的排序函數(shù)讓我們避免了比賽手寫排序,給我們解題帶來了的便利。在Java的Arrays類中也封裝好了類似的方法sort()。
基本格式:
Arrays.sort(num);
Arrays.sort(num,c);
Arrays.sort(num,0,n);
Arrays.sort(num,0,n,c);
1.Arrays.sort(num);
這種格式的調(diào)用只能適用于數(shù)組在創(chuàng)建時就初始化的情況,默認(rèn)將數(shù)組升序排序。
import java.util.*; public class Main {public static void main(String[] args) {int num[]=new int[] {1,9,2,6,0,8,1,7};Arrays.sort(num);for(int i=0;i<num.length;i++) {System.out.print(num[i]+" ");}} }運(yùn)行結(jié)果:
0 1 1 2 6 7 8 9
2.Arrays.sort(num,c);
但是如果只進(jìn)行升序排序則不能滿足我們的比賽需求。如需降序排序,這種格式就派上用場了。類似C++的sort()函數(shù)的參數(shù)cmp函數(shù),這里需要傳入實(shí)現(xiàn)了Comparator接口的類的對象c。
這種重載形式的方法原型如下:
public static void sort(T[] a,Comparator<? super T> c)
從函數(shù)原型中可以看出,我們的num數(shù)組的類型必須是基本類型(如int、char、double……)對應(yīng)的類(如Integer、Character、Double……)的對象(而且數(shù)組必須在創(chuàng)建時就初始化)
對于實(shí)現(xiàn)了Comparator接口的類的對象c的寫法,如果只是對基本類型對應(yīng)的類對象的排序,我個人比較推薦匿名內(nèi)部類的寫法。
import java.util.*; public class P1478 {public static void main(String[] args) {Integer num[]=new Integer[] {1,9,2,6,0,8,1,7};//初始化Integer對象的數(shù)組Arrays.sort(num,new Comparator<Integer>() {public int compare(Integer a,Integer b) {return b-a;}});for(int i=0;i<num.length;i++) {System.out.print(num[i]+" ");}} }運(yùn)行結(jié)果:
9 8 7 6 2 1 1 0
3.Arrays.sort(num, fromIndex, toIndex);
和前面的格式相比,這種更為通用。它能運(yùn)用在數(shù)組在運(yùn)行過程初始化的情況,給下標(biāo)在區(qū)間[fromIndex, toIndex)的元素排序。
import java.util.*; public class Main {static final int maxn=100005;static int n;static int num[]=new int[maxn];public static void main(String[] args) {Scanner cin=new Scanner(System.in);n=cin.nextInt();for(int i=0;i<n;i++) {num[i]=cin.nextInt();}Arrays.sort(num, 0,n);for(int i=0;i<n;i++) {System.out.println(num[i]);}} }輸入:
8
1 9 2 6 0 8 1 7
運(yùn)行結(jié)果:
0 1 1 2 6 7 8 9
4.Arrays.sort(num,0,n,c);
- 這種格式只是在第2種的基礎(chǔ)上加上了第3種,于是他們的特點(diǎn)也是相疊加的,這里就不多加贅述了。
- 通常這種格式會被運(yùn)用在我們C++中需要用上結(jié)構(gòu)體排序的題目上,因?yàn)閷τ谧远x的數(shù)據(jù)類型,排序時一定要寫cmp函數(shù)。Java中沒有結(jié)構(gòu)體,所以我們只能類似寫結(jié)構(gòu)體那樣定義類。(注意:如果定義的類寫在主類里面,就要加上static關(guān)鍵字,寫在外面則不用)
- 對于實(shí)現(xiàn)了Comparator接口的類的對象c的寫法,如果只要排序一次,我們還是可以寫匿名內(nèi)部類。如果是多次排序的話,我們可以讓定義的類實(shí)現(xiàn)Comparator接口,寫把compare方法寫在定義的類里面。(最后例題的代碼就是這種寫法)
- 要輸入定義的類對象的數(shù)據(jù)時,要先初始化該對象(例如下面的:num[i]=new People();)
實(shí)戰(zhàn)演練
不管怎么樣,剛學(xué)的東西還是要練練的。下面是來自洛谷的一道運(yùn)用到結(jié)構(gòu)體排序的題目,雖然比較簡單,但是也算是一種實(shí)戰(zhàn)吧。
傳送門
題目描述
又是一年秋季時,陶陶家的蘋果樹結(jié)了n個果子。陶陶又跑去摘蘋果,這次她有一個a公分的椅子。當(dāng)他手夠不著時,他會站到椅子上再試試。
這次與NOIp2005普及組第一題不同的是:陶陶之前搬凳子,力氣只剩下s了。當(dāng)然,每次摘蘋果時都要用一定的力氣。陶陶想知道在s<0之前最多能摘到多少個蘋果。
現(xiàn)在已知n個蘋果到達(dá)地上的高度xi,椅子的高度a,陶陶手伸直的最大長度b,陶陶所剩的力氣s,陶陶摘一個蘋果需要的力氣yi,求陶陶最多能摘到多少個蘋果。
輸入格式:
第1行:兩個數(shù) 蘋果數(shù)n,力氣s。
第2行:兩個數(shù) 椅子的高度a,陶陶手伸直的最大長度b。
第3行~第3+n-1行:每行兩個數(shù) 蘋果高度xi,摘這個蘋果需要的力氣yi。
輸出格式:
只有一個整數(shù),表示陶陶最多能摘到的蘋果數(shù)。
輸入樣例#1:
8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2
輸出樣例#1:
4
說明
所有數(shù)據(jù):n<=5000 a<=50 b<=200 s<=1000
分析
簡單的貪心法題目,只要把蘋果按按消耗的體力升序排序,然后只要能夠得著就去摘(計數(shù)器加一),當(dāng)體力不足以摘蘋果或者遍歷了所有蘋果之后結(jié)束,最后輸出。
//貪心法的證明?我不會證明QAQ
代碼如下
import java.util.*; public class Main {static class Apple implements Comparator<Apple>{ //實(shí)現(xiàn)Comparator接口int cost,height;public int compare(Apple a,Apple b) {return a.cost-b.cost;}}static int n,s,ans;static int a,b;static Apple num[]=new Apple[5005];public static void main(String[] args) {Scanner cin=new Scanner(System.in);n=cin.nextInt();s=cin.nextInt();a=cin.nextInt();b=cin.nextInt();for(int i=0;i<n;i++) {num[i]=new Apple(); //不要忘記num[i].height=cin.nextInt();num[i].cost=cin.nextInt();}Arrays.sort(num,0,n, new Apple()); //觀察參數(shù)for(int i=0;i<n&&s>=num[i].cost;i++) {if(num[i].height<=a+b) {ans++;s-=num[i].cost;}}System.out.println(ans);}}總結(jié)
以上是生活随笔為你收集整理的Java的Arrays.sort()良心总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯 算法提高 递推求值(矩阵快速幂)
- 下一篇: C++描述的位运算总结