蓝桥杯试题 数列排序

本文介绍了如何使用Java的Arrays.sort()方法对整数数组进行排序,包括基本数据类型的排序和自定义类的排序。同时,通过一个选择排序算法的实现,展示了手动排序的过程。对于蓝桥杯数列排序问题,推荐使用Arrays.sort()方法,其时间复杂度更低。
摘要由CSDN通过智能技术生成

蓝桥杯试题 数列排序

问题描述
  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200 
输入格式
  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
  输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9

思路分析:这道题很简单,就是写一个排序,而排序算法在编程时候经常遇到,我借这道题做一个简单的总结。
解法1:对数组的排序可以调用Arrays类中的sort方法。
用法:
1)数组中元素类型是基本数据类型,调用public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序。参数:a - 要排序的数组
这种针对数组中元素类型为数字型,比如byte,double等。例如:

public class Demo {
    public static void main(String[] args) {
        double[] temp = new double[]{2.1,5.5,1.2,98.3,66.6};
        Arrays.sort(temp);
        for(double t:temp){
            System.out.println(t);
        }
    }
}

输出

1.2
2.1
5.5
66.6
98.3

2)数组中的元素类型为其他数据类型,比如String,以及自定义的类。这种情况调用sort方法时候,会根据元素实现的Comparable接口来进行排序换句话说,如果数据类型是Java中写好了的,那么一般Java都写好了他的比较方法,调用sort方法就是按照比较方法对数组中的元素进行排序。例如String类:Java已经写好了他的比较方法,从第一个字符依次比较字符大小(Ascll码顺序),这种我们就不用再写比较方法了。如果是自己定义的类,那么需要实现Comparable接口(写该类的比较方法)。例子1是对String类对象数组进行排序,例子2是对自定义类stu的数组进行排序,其中排序方法是先根据学生分数高低排序。
例子1:

public class Demo {
    public static void main(String[] args) {
        String[] ss = new String[]{"bcde","abcd","abdc","jkl"};
        Arrays.sort(ss);
        for(String s:ss){
            System.out.println(s);
        }
    }
}

输出:

abcd
abdc
bcde
jkl

可以看到,最后的排序结果是逐个对字符进行排序得到的。
例子2:

public class Demo {
    public static void main(String[] args) {
        stu[] temp = new stu[3];
        temp[0] = new stu(1, 2);
        temp[1] = new stu(3,4);
        temp[2] = new stu(5,6);
        //sort通过查询stu类的比较方法从而对temp进行排序
        Arrays.sort(temp);
        //按序输出学生学号
        for(stu t:temp){
            System.out.println(t.number);
        }
    }
}
//自定义stu类,实现Comparable接口,按照成绩从大到小排序
class stu implements Comparable{
    //两个属性成绩和学号
    int score;
    int number;
    public stu(int score, int number) {
        this.score = score;
        this.number = number;
    }
    @Override
    public int compareTo(Object o) {
        if(o instanceof stu){
            stu t = (stu) o;
            //如果需要从大到小,那么return score - t.score;即可
            return t.score-score;
        }
        //这个语句是执行不了的,只是让编译器不报错,准确来说应该用异常来处理,没学异常的话就不用管。
        return 0;
    }
}

输出:

6
4
2

那么再拉回来看这道题目是不是超级简单,只需要调用一下Arrays.sort()方法即可。代码如下:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //数据输入
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }
        //对数组排序
        Arrays.sort(arr);
        //数据输出
        for(int i:arr){
            System.out.print(i+" ");
        }
    }
}

解法2,这个就是自己来写排序算法了,我是因为自己踩过坑,有时候忘记了排序的语法,但是又要排序,就只有自己老老实实写一个排序算法,由于排序算法很多,我觉得最容易理解的是选择排序的方法,这个排序方法的思路是,假设数组中待排序的元素个数是n个,那么第一次从n里面选取最大(最小)的元素放在第一位,第二次从n-1里面选择最大(最小)的元素放在第二位…直到第n-1次。时间复杂度O(n^2)。看一下具体实现吧:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //数据输入
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }
        //对数组排序
        //第一个循环是对第i个位置进行排序
        for (int i = 0; i < arr.length - 1; i++) {
            int min = arr[i];
            int index = i;
            //第二个循环是比较第i个位置后面的元素,如果比arr[i]小的话就记录
            //此时的下标,并且将min变为现在的值。
            for (int j = i+1; j < arr.length; j++) {
                if(arr[j]<min){
                    index = j;
                    min = arr[j];
                }
            }
            //如果比较完毕后index的值不等于i,那么需要交换位置
            if(index != i){
                int temp = arr[i];
                arr[i] = arr[index];
                arr[index] = temp;
            }
        }
        //数据输出
        for(int i:arr){
            System.out.print(i+" ");
        }
    }
}

PS:如果对数组进行排序,那么强烈建议第一种解法,毕竟JAVA自己就写好了排序方法嘛,还有调用的方法时间复杂度也低得多,O(nlogn)。
如果这道题目要求从大到小排序的话,可以自己反序一下,写个for即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值