Java入门 - 数组进阶

本文介绍了选择排序的基本原理,通过打擂台的方式求解数组最大值,并演示了如何实现降序排序的过程。编程要求部分给出了一个简化版代码,挑战读者优化并实现更高效版本。
摘要由CSDN通过智能技术生成

 

第4关:选择排序

200

  • 任务要求
  • 参考答案

任务描述

本关任务:实现数组从大到小的排序(降序排序)。

相关知识

为了解决数组排序的问题你需要先了解:选择排序。

选择排序

关于选择排序,你可以理解为一个循环打擂台的过程,还记得我们在上一章节中求数组中的最大值吗?

我们运用打擂台的原理,可以求出数组中的最大值。 核心代码:

 
  1. int max = scores[0];
  2. for (int i = 1; i < scores.length; i++) {
  3. if(max < scores[i]){ //求最大值
  4. max = scores[i];
  5. }
  6. }

这样一轮循环之后我们就可以求出数组scores的最大值。 第一轮擂台赛求出最大值之后,我们可以对接下来的数据再进行打擂台的操作,就出剩下数据的最大值(也就是第二大的值),以此类推,就可以实现数组从大到小的排序。

实现过程

为了实现选择排序,我们需要求出最大值,并且和相比较的数据交换位置:接下来我们对数组int[] arr = {6,5,8,0,2,9}来进行第一趟循环,将最大值移动到数组的第一位。

代码实现:

 
  1. int[] arr = {6,5,8,0,2,9};
  2. for (int i = 0; i < arr.length-1; i++) {
  3. if(arr[0] < arr[i+1]){
  4. int temp = arr[0];
  5. arr[0] = arr[i+1];
  6. arr[i+1] = temp;
  7. }
  8. }

一次循环操作就可以找出数组中的最大值,并将其移动到数组的首位,所以对于一个长度为6的数组,我们只需要进行5(length-1)次上述操作即可将数组降序排序了。

接下来我们进行第二趟循环,求第二大的值,并将其移动到数组的第二个位置。因为我们已经求出了最大值,所以这一次循环,最大值不用参与比较。

代码实现:

结果:[9, 8, 5, 0, 2, 6]

可以发现经过两轮循环我们找出了数组中最大的两个值,并且移动他们到了数组的前两位。

现在按照上述步骤就可以实现数组的排序了,不过如果我们照搬上述代码,就会有很多冗余的代码,所以需要你来改进,怎么改进是需要你思考的。

告诉你一个秘密:使用Arrays.toString(数组)可以直接输出数组中的值哦! 如下:

输出结果:[6, 5, 8, 0, 2, 9]

思考题

本关所讲述的选择排序是一个简化版本,如果你想要学习优化版可以根据下列图片,编写出相应代码,然后在评论区贴出来哦。

上图就是一个使用选择排序将一个数组中数据从小到大排序的过程,请思考如何用代码实现上述过程。

原理:每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。


本关难度较大,但这是学习数组绕不过去的一关,多思考,多尝试,你能成功的,加油!

编程要求

在右侧Begin-End区域中添加代码,实现对数组arr的降序排序,并输出排序后的arr数组。

测试说明

我会对你的程序进行测试; 预期输入:6650289 预期输出:[9, 8, 6, 5, 2, 0]

预期输入:4312113 预期输出:[13, 12, 3, 1]

package step4;

import java.util.Arrays;
import java.util.Scanner;

public class HelloWorld {
	
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//动态创建数组
		int[] arr = new int[sc.nextInt()];
		for(int i = 0 ; i< arr.length ; i++){
			arr[i] = sc.nextInt();
		}
		/********** Begin **********/
		for(int i=0;i<arr.length-1;i++)
            for(int j=i+1;j<arr.length;j++)
                if(arr[i]<arr[j])
                {
                    int t=arr[i];
                    arr[i]=arr[j];
                    arr[j]=t;
                }
		//System.out.println(arr);//这个只会打印出数组的地址
		 System.out.println(Arrays.toString(arr));
		
		
		
		
		/********** End **********/
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值