赞
踩
实现原理:sort并不是简单的快速排序,它对普通的快速排序进行了优化,此外,它还结合了插入排序和推排序。系统会根据你的数据形式和数据量自动选择合适的排序方法,这并不是说它每次排序只选择一种方法,它是在一次完整排序中不同的情况选用不同方法,比如给一个数据量较大的数组排序,开始采用快速排序,分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归,而是选择插入排序,如果递归的太深,他会选择推排序。
Arrays中的sort()方法主要是针对各种数据类型(基本数据类型和引用对象类型)的数组元素排序。
import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Main { public static void main(String[] args) { Integer[] ans=new Integer[]{3,1,6,2,9}; Integer[] ans1=new Integer[]{3,1,6,2,9}; Arrays.sort(ans); Arrays.sort(ans1,2,5,Collections.reverseOrder()); for(int i:ans){ System.out.print(i+" "); } System.out.println(); for(int i:ans1){ System.out.print(i+" "); } } }
引用对象类型数组的排序sort()方法要用到接口Comparator,对其排序内部的比较函数compare()进行重写,以便于我们按照我们的排序要求对引用对象数组极性排序,默认是升序排序,但可以自己自定义成降序排序
public class Test { public static void main(String[] args) { /* * 注意,要想改变默认的排列顺序,不能使用基本类型(int,double,char)而要使用它们对应的类 */ Integer[] a = { 9, 8, 7, 2, 3, 4, 1, 0, 6, 5 }; // 定义一个自定义类MyComparator的对象 Comparator cmp = new MyComparator(); Arrays.sort(a, cmp); for (int arr : a) { System.out.print(arr + " "); } } } // 实现Comparator接口 class MyComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { /* * 如果o1小于o2,我们就返回正值,如果o1大于o2我们就返回负值, 这样颠倒一下,就可以实现降序排序了,反之即可自定义升序排序了 */ return o2 - o1; } }
Collections类中的sort方法可以实现对List接口的集合进行排序。这个方法假定列表元素实现了Comparable接口。
//定义一个字符串的list集合,并排序 List<String> list = new ArrayList<>(); list.add("123"); list.add("213"); list.add("abc"); list.add("aac"); list.add("112"); list.add("224"); list.add("223"); list.add("Aac"); System.out.println(list); //[123, 213, abc, aac, 112, 224, 223, Aac] Collections.sort(list); System.out.println(list); //[112, 123, 213, 223, 224, Aac, aac, abc]
class Students{ String name; int age; public Students(String name,int age){ this.name=name; this.age=age; } } public class Test9 { public static void main(String[] args) { ArrayList<Students> list=new ArrayList<Students>(); list.add(new Students("张三", 18)); list.add(new Students("李四", 16)); list.add(new Students("王二", 21)); list.add(new Students("麻子", 25)); Collections.sort(list,new Comparator<Students>() { @Override public int compare(Students o1, Students o2) { //return o1.age - o2.age;升序 return o2.age - o1.age;//降序 } }); for(Students s:list){ System.out.println(s.name+" "+s.age); } } }
方式二:
class Students implements Comparable<Students>{ String name; int age; public Students(String name,int age){ this.name=name; this.age=age; } public int compareTo(Students s) { // TODO Auto-generated method stub return s.age-this.age;//降序 } } public class Test9 { public static void main(String[] args) { ArrayList<Students> list=new ArrayList<Students>(); list.add(new Students("张三", 18)); list.add(new Students("李四", 16)); list.add(new Students("王二", 21)); list.add(new Students("麻子", 25)); Collections.sort(list); for(Students s:list){ System.out.println(s.name+" "+s.age); } } }
推荐算法练习题:
分数线划定
帮贡排序
蓝桥杯2021年真题:
双向排序
不过这题用sort,相当于用暴力枚举只能得60分,会显示超时
import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 import java.util.Arrays; import java.util.Collections; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n=scanner.nextInt(); int m=scanner.nextInt(); Integer[] ans=new Integer[n]; for(int i=0;i<n;i++){ ans[i]=i+1; } for(int j=0;j<m;j++){ int p=scanner.nextInt(); int q=scanner.nextInt(); if(p==0){ Arrays.sort(ans,0,q,Collections.reverseOrder()); }else{ Arrays.sort(ans,q-1,ans.length); } } for(int a :ans){ System.out.print(a+" "); } scanner.close(); } }
此题正解请参考以下博客:
https://blog.csdn.net/qq_53269123/article/details/122832906
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。