备战蓝桥杯(一)- 善用sort()


前言

在准备蓝桥杯的过程中,突然心血来潮,想和大家分享一下做蓝桥杯历年真题时用到的技巧、常用的算法模板以及蓝桥杯历年题目的解题思路及代码。所以,《 备战蓝桥杯》专栏就来了。希望大家一起努力,在今年的蓝桥杯中取得理想的成绩。


一、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()不手写。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值