Java实现选择排序
作者:这个对数不太对 发布时间:2021-06-30 16:53:55
问题描述
利用选择排序把一列数组按从小到大或从大到小排序
(一)、选择排序思想
以从小到大为例:
1、第一轮选择,从第一个数开始,依次比较后面所有的数,不断选出当前最小的数,直到选出这一轮最小的数,放到第一位
2、第二轮选择,从第二个数开始,依次比较后面所有的数,不断选出当前最小的数,直到选出这一轮最小的数,放到第二位
3、如此循环,直到所有数从小到大排列
(二)、问题分析
1. 输入数组
根据用户输入的进行排序的数字数量n,建立一个长度为n的数组
public static void main (String[] args){
int n,m;
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想排序的数量n");
n=sc.nextInt();
int [] arrary = new int[n];
System.out.println("请输入"+n+"个数,并用空格隔开");
for(int i=0;i<arrary.length;i++){
arrary[i]=sc.nextInt();
}
2.输入如何排序
设置两条路径:m=1为从小到大,m=2为从大到小,m=其他 提醒用户重新输入
System.out.println("请问你想:1.从小到大 2.从大到小 排序?");
m=sc.nextInt();
while (m!=1 && m!=2 ){
System.out.println("输入有误请再次输入");
m = sc.nextInt();
continue;
}
3.排序算法
(1)数组长度 arrary.length 也就是用户输入的 n
(2)j 表示第 j +1轮排序,这里面n-1轮排序就已足够
(3)每一轮都有一个当前最小数的索引
(4)初始时索引给第一个位置的数,与之后面的数依次比较,遇到比自己小的数,就把该索引给更小的数
(5)依次比较,直到索引给了这一轮中最小的数
(6)再把该数放在第一个位置,即交换拿到了索引的位置的数与第一个数的位置
(7)第二轮索引给第二个位置的数,找到了除了第一个位置的数以外的最小的数,交换拿到了第二轮索引的位置的数与第二个数的位置
(8)较大数与较小数交换位置的经典算法:若a>b; 则c=a; a=b; b=c;
(9)从大到小排序只需把 array[index]>array[k] 换成 array[index]<array[k] 即可
(10)选择进行何种排序,在 if 语句的判断框里加上此时m应该等于的值
(11)因为要先选择进行何种排序,才能进行排序,所以把 m==1 放在 arrary[k]>arrary[k+1] 前面,且用短板与 && ,这样更易于理解(如果m≠1,则直接进行else if 的语句)
(12)也可以 m==1 & array[index]>array[k] 或 array[index]>array[k] & m==1,但不能 array[index]>array[k] && m==2。
for(int j=0;j<array.length-1;j++){
int index=j;
for(int k=j;k<array.length;k++){
if(m==1 && array[index]>array[k]){
index=k;
}
if(m==2 && array[index]<array[k]){
index=k;
}
int a=array[j];
array[j]=array[index];
array[index]=a;
}
}
4.输出数组
由于输出的是一段数组,所以还需要引用一段 for 语句
System.out.print("选择"+m+"的结果为:");
for(int j=0;j<arrary.length;j++)
System.out.print(arrary[j]+" ");
(三)、完整代码
把上述代码整理
import java.util.*;
public class Selection {
public static void main (String[] args){
int n,m;
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想排序的数量n");
n=sc.nextInt();
System.out.println("请问你想:1.从小到大 2.从大到小 排序?");
m=sc.nextInt();
while (m!=1 && m!=2 ){
System.out.println("输入有误请再次输入");
m = sc.nextInt();
continue;
}
int [] array = new int[n];
System.out.println("请输入"+n+"个数,并用空格隔开");
for(int i=0;i<array.length;i++){
array[i]=sc.nextInt();
}
for(int j=0;j<array.length-1;j++){
int index=j;
for(int k=j;k<array.length;k++){
if(m==1 && array[index]>array[k]){
index=k;
}
if(m==2 && array[index]<array[k]){
index=k;
}
int a=array[j];
array[j]=array[index];
array[index]=a;
}
}
System.out.print("选择"+m+"的结果为:");
for(int j=0;j<array.length;j++)
System.out.print(array[j]+" ");
}
}
(四)、运行结果
来源:https://blog.csdn.net/m0_57060319/article/details/119852555


猜你喜欢
- 目录前言基本概念实践1. 首先准备一个控制台小程序2. 编写使用 AppDomain 的程序一些思考1. 为什么不使用 AppDomain
- 一、摘要本篇阐述基于TCP通信协议的异步实现。二、实验平台Visual Studio 2010三、异步通信实现原理及常用方法3.1 建立连接
- 本文实例为大家分享了Android自定义view贝塞尔曲线,供大家参考,具体内容如下贝塞尔曲线以一个简单的贝塞尔曲线为例,二阶曲线原理贝塞尔
- 本文实例讲述了java数据结构与算法之快速排序。分享给大家供大家参考,具体如下:交换类排序的另一个方法,即快速排序。快速排序:改变了冒泡排序
- 年前无意看到一个用Python写的小桌面程序,可以自动玩扫雷的游戏,觉得挺有意思,决定用C#也做一个。【真实情况
- 前面的文章已经实现相关的布局,本文接着进行相关的功能实现读取系统联系人当点击“选择联系人”按钮后,弹出联系人列表,读取系统联系人分如下几个步
- Java中IO的模型分为三种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。BIO【同步阻塞】在JDK1.4出来之前,我们建立网
- 假定你已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器。一、cpu占用过高cpu占用过高要分情况讨论,
- 代码:package com.lwj.test.proxy;import java.lang.reflect.InvocationHandl
- 前言继上次skywalking出故障《解析Arthas协助排查线上skywalking不可用问题》不到一个月,线上skywalking又出毛
- spring boot是个好东西,可以不用容器直接在main方法中启动,而且无需配置文件,方便快速搭建环境。可是当我们要同时启动2个spri
- 目录前言一、Android应用DAC沙盒二、Android应用权限三、应用信息的存储四、应用权限的映射五、应用的SELinux标签六、And
- 本文实例分析了Android中BaseAdapter的用法。分享给大家供大家参考,具体如下:最近做一个项目,项目中用到了ListView,L
- mybatis介绍 * 的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截
- JdbcTypeInterceptor运行时自动添加 jdbcType 属性 * 签名@Intercepts({
- 1、什么是过滤器?在客户端到服务器的过程中,当发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行,在服务器给客户
- 事件函数的执行顺序先说一下执行顺序吧。 官方给出的脚本中事件函数的执行顺序如下图: 我们可以做一个小实验来测试一下: 在Hierarchy
- 简介本文主要讲解java 利用Selenium 操作浏览器网站时候,需要用的js的地方,代码该如何实现。调用JavaScriptwebdri
- 前言:前面几篇讲了自定义控件绘制原理Android自定义控件基本原理详解(一) ,Android自定义控件之自定义属性(二) ,Androi
- 1.Context的应用Context在启动协程模式中就已经遇到过叫CoroutineContext,它的意思就是协程上下文,线程的切换离不