前言
在准备蓝桥杯的过程中,突然心血来潮,想和大家分享一下做蓝桥杯历年真题时用到的技巧、常用的算法模板以及蓝桥杯历年题目的解题思路及代码。所以,《 备战蓝桥杯》专栏就来了。希望大家一起努力,在今年的蓝桥杯中取得理想的成绩。
一、sort()是什么?
sort()是类库中排序方法,在做一些题目时,当涉及到排序时,很多小伙伴只能写出 O ( n 2 ) {\color{Blue}O(n^2) } O(n2)的排序算法,费时又费力。我们为何不直接调用别人写好的方法呢?sort()方法的时间复杂度为 O ( n lg n ) {\color{Blue}O(n\lg{n} ) } O(nlgn)。下面介绍一下sort()如何使用。
二、sort()如何用?
下面介绍java类库中的sort()方法。
1.默认排序
sort()方法有三个参数,第一个参数是数组名,第二个参数是期望排序的起始下标,期望排序的结束下标+1。
举个栗子,我想对下面这个数组中所有元素排序,则起始下标为0。
由于数组中最后一个元素下标为7,则期望排序的结束下标=7+1=8;
或者结束下标可以写成a.length-1+1=a.length(因为数组最后一个元素下标为a.length-1)。
代码如下(示例):
public class sort_默认排序 {
public static void main(String[] args) {
int[] a = {7,1,4,6,5,9,2,6};
Arrays.sort(a,0,8);//使用这个方法时不要忘记import java.util.Arrays;嗷
//接下来输出数组a中元素的值
System.out.println(Arrays.toString(a));
//控制台输出结果为:
//[1, 2, 4, 5, 6, 6, 7, 9]
}
}
有的小伙伴可能会想,我能不能只对数组中部分元素排序呢?这是当然可以的!
举个栗子
我想对上面数组中的4,6,5这四个数排序,那么期望排序的起始下标为2,期望排序的结束下标为4+1=5。
public class sort_默认排序 {
public static void main(String[] args) {
int[] a = {7,1,4,6,5,9,2,6};
Arrays.sort(a,2,5);
//接下来输出数组a中元素的值
System.out.println(Arrays.toString(a));
//控制台输出结果为:
//[7, 1, 4, 5, 6, 9, 2, 6]
}
}
2.自定义排序
当涉及到的不是基本数据类型排序时,还能用sort()吗?当然可以!
比如涉及到的数据类型为Student类型,我想按成绩升序排序,如何操作呢。
Student类如下:
class Student{
public String name;//名字
public double score;//成绩
public Student(String name,double score){
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "姓名:" + name + ",分数:" + score;
}
}
首先我们需要创建一个实现Comparator接口的类;
代码如下(示例):
class cmp implements Comparator<Student> {
//重写compare()方法
@Override
public int compare(Student o1, Student o2) {
//在此方法中实现希望按什么排序及排序的类型
//比如按学生成绩升序排序
if(o1.score > o2.score){
return 1;
}else if(o1.score < o2.score){
return -1;
}else{
return 0;
}
//上述代码可简写为
//return o1.score - o2.score;
}
}
接下来我们调用sort()方法,第一个参数为数组名,第二个参数为实现Comparator类的对象。
代码如下(示例):
public static void main(String[] args) {
Student[] s = new Student[3];
s[0] = new Student("小张",95.00);
s[1] = new Student("小红",100.00);
s[2] = new Student("小明",92.00);
//输出没排序前结果
for(int i = 0; i < s.length;i++){
System.out.println(s[i]);
}
//没排序前,控制台输出结果如下
//姓名:小张,分数:95.0
//姓名:小红,分数:100.0
//姓名:小明,分数:92.0
//接下来进行排序
Arrays.sort(s,new cmp());//第二个参数直接使用匿名对象
for(int i = 0; i < s.length;i++){
System.out.println(s[i]);
}
//排序后,控制台输出结果如下
//姓名:小明,分数:92.0
//姓名:小张,分数:95.0
//姓名:小红,分数:100.0
}
好了,实现自定义排序就完成了,是不是很简单啊。
附完整代码:
package exer;
import java.util.*;
/**
* @author 匆匆那年
* @create 2022-01-16 11:00
*/
class Student{
public String name;//名字
public double score;//成绩
public Student(String name,double score){
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "姓名:" + name + ",分数:" + score;
}
}
class cmp implements Comparator<Student> {
//重写compare()方法
@Override
public int compare(Student o1, Student o2) {
//在此方法中实现希望按什么排序及排序的类型
//比如按学生成绩升序排序
if(o1.score > o2.score){
return 1;
}else if(o1.score < o2.score){
return -1;
}else{
return 0;
}
//上述代码可简写为
//return o1.score - o2.score;
}
}
public class sort_自定义排序 {
public static void main(String[] args) {
Student[] s = new Student[3];
s[0] = new Student("小张",95.00);
s[1] = new Student("小红",100.00);
s[2] = new Student("小明",92.00);
//输出没排序前结果
for(int i = 0; i < s.length;i++){
System.out.println(s[i]);
}
//没排序前,控制台输出结果如下
//姓名:小张,分数:95.0
//姓名:小红,分数:100.0
//姓名:小明,分数:92.0
//接下来进行排序
Arrays.sort(s,new cmp());//第二个参数直接使用匿名对象
for(int i = 0; i < s.length;i++){
System.out.println(s[i]);
}
//排序后,控制台输出结果如下
//姓名:小明,分数:92.0
//姓名:小张,分数:95.0
//姓名:小红,分数:100.0
}
}
三、蓝桥杯相应题目
小伙伴们,非常抱歉。由于博主蓝桥杯题目现在刷的比较少,还没有找到非常合适的题目,等刷到响应的题目后,我会第一时间补充上来,希望大家见谅。
{}
总结
题目涉及排序时,能调sort()不手写。