蓝桥杯试题 数列排序
问题描述
给定一个长度为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即可。