Java数据结构之排序---选择排序
简单选择排序的介绍:
从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的。
简单选择排序的基本思想:
假定我们的数组为int [] arr = new int[n],第一次我们从arr[0]~arr[n-1]中选择出最小的值与arr[0]交换。第二次我们从arr[1]~arr[n-1]中选择出最小的值与arr[1]交换。第三次我们从arr[2]~arr[n-1]中选择出最小的值与arr[2]交换,...,第i次我们从arr[i-1]~arr[n-1]中选择出最小的值与arr[i-1]交换,...,第n-1次我们从arr[n-2]~arr[n-1]中选择出最小的值与arr[n-2]交换。我们总共进行n-1次的交换,从而得到一个由小到大的排序序列。
简单选择排序的思路详解:
例子:原始的数组:[101,34,119,1]
经过第一次选择排序之后,我们得到的数组:1,[34,119,101]
经过第二次选择排序之后,我们得到的数组:1,34,[119,101]
经过第三次选择排序之后,我们得到的数组:1,34,101,[119]
这个时候,我们的序列已经有序了,并且我们执行的次数一共是是4次(n-1)。
针对上述的例子我们进行说明如下:
(1).选择排序一共有数组大小-1(n-1)轮排序
(2).每一轮排序,又是一个循环,我们先假定每次循环的第一个数都是最小的数,然后和后面的每个数进行比较,如果发现有比当前更小的数,就重新确定这个最小的数,并且要得到这个数的下标。依次进行循环
上述过程在代码中我会通过注释说明。
下面的代码中,我会将选择排序通过两种代码实现:分步骤的实现,整体的实现。在代码中,我们测试的数组是:[101,34,119,1]
(1).分步骤的实现选择排序
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
} //选择排序
public static void selectSort(int[] arr){
//第一趟排序
System.out.println("执行的第一趟排序:");
//首先我们要假设第一个元素是最小的,并且记录最小元素的下标,这里我们分别用min,minIndex表示。
int min = arr[0];
int minIndex = 0;
for(int j = 1+0;j<arr.length;j++){ //这是第一次的循环,我们要从第二个数开始算起,与第一个数比较。
if(min>arr[j]){ //当我们的min值大于后面的数时,说明min不是最小的,这时候,我们将min与最小的值交换,并且让minIndex索引变成最小值的索引。
min = arr[j];
minIndex = j;
}
}
//通过上面的交换,我们可以得到这趟序列中最小的元素的值。
//因为我们的第一个元素是我们指定的最小元素,因此在找到比第一个元素更小的元素后,我们应该让其与第一个元素交换。
arr[minIndex] = arr[0];
arr[0] = min;
System.out.println(Arrays.toString(arr)); //接下来的几趟排序与第一趟相同
//第二趟排序
System.out.println("执行的第二趟排序:");
min = arr[1];
minIndex = 1;
for(int j = 1+1;j<arr.length;j++){ //j=1+1这个需要注意,因为是第二趟排序,所以应该加1.
if(min > arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[1];
arr[1] = min;
System.out.println(Arrays.toString(arr)); //第三趟排序
System.out.println("执行的第三趟排序:");
min = arr[2];
minIndex = 2;
for(int j = 1+2;j<arr.length;j++){
if(min > arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[2];
arr[2] = min;
System.out.println(Arrays.toString(arr));
}
上述代码我们得到的最终结果是:
(2).整体的代码实现
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
} //选择排序
public static void selectSort(int[] arr){ //选择排序的算法
//通过上面的分步,我们可以知道,可以通过循环嵌套来实现
for(int i=0;i<arr.length-1;i++){ //i代表的就是实现该算法的次数。,具体的解释可以看上述代码
int min = arr[i];
int minIndex = i;
for(int j=i+1;j<arr.length;j++){ //j=i+1这个地方就是代表了,j应该从i+1个位置开始算起,因为之前的已经排好序了~
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[i];
arr[i] = min;
System.out.println("第"+(i+1)+"趟排序的结果:");
System.out.println(Arrays.toString(arr)); } }
上述代码我们得到最终的结果是:
但是,还有一点值得注意的是,观察我们第二趟的结果,我们发现与第一趟的结果是相同的,也就是说,我们在进行选择排序的过程中,可能出现第一个数就是最小的数,这样的话我们可以不需要执行交换的代码,因此选择排序的算法我们可以做进一步的优化,优化代码如下(注释里面有解释):
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
} //选择排序
public static void selectSort(int[] arr){ //选择排序的算法
//通过上面的分步,我们可以知道,可以通过循环嵌套来实现
for(int i=0;i<arr.length-1;i++){ //i代表的就是实现该算法的次数。,具体的解释可以看上述代码
int min = arr[i];
int minIndex = i;
for(int j=i+1;j<arr.length;j++){ //j=i+1这个地方就是代表了,j应该从i+1个位置开始算起,因为之前的已经排好序
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
if(minIndex != i){ //我们通过比较minIndex与i的值来确定是否 最小值发生了改变,如果没有改变,我们不需要执行下面的代码。
arr[minIndex] = arr[i];
arr[i] = min;
System.out.println("第"+(i+1)+"趟排序的结果:");
System.out.println(Arrays.toString(arr));
} } }
最终得到的结果如下:
Java数据结构之排序---选择排序的更多相关文章
- java数据结构和算法------选择排序
package iYou.neugle.sort; public class Select_sort { public static void SelectSort(double[] array) { ...
- Java基础(46):选择排序的Java封装(完整可运行)
1 package lsg.ap.select; import java.util.Random; public class SelectSort { //选择排序 /** *@author: 梁山广 ...
- Java版冒泡排序和选择排序
一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...
- 数据结构 - 只需选择排序(simple selection sort) 详细说明 和 代码(C++)
数据结构 - 只需选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601 ...
- java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试
1.冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的. 它的时间复杂度是O(n*n),空间复杂度是O(1) 代码如下,很好理解. public void bubbl ...
- Java数据结构与算法之排序
排序从大体上来讲,做了两件事情: 1.比較两个数据项: 2.交换两个数据项.或复制当中一项 一.冒泡排序 大O表示法:交换次数和比較次数都为O(N*N). 算法原理: 1.比較相邻的元素.假设第一个比 ...
- java 冒泡排序法、选择排序
1.冒泡排序 /* * 冒泡排序 * 外层控制循环多少趟,内层控制每一趟的循环次数 */ public class Test08 { public static void main(String[] ...
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- Java数据结构和算法 - 高级排序
希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...
随机推荐
- [转帖]oracle 00600 4194 4193 问题的处理
oracle断电重启之ORA-00600[4194] https://www.cnblogs.com/xwdreamer/p/3778383.html 部门的机器出现异常 断电导致的 错误 从网上学了 ...
- 阿里云安装filezilla
1.连接服务器 ssh 或者 远程连接 到服务器: 2.安装相应软件 安装EPEL,EPEL是yum的一个软件源,里面包含了许多基本源里没有的软件: yum -y install epel-relea ...
- redis远程连接配置
解决redis远程连接不上的问题 redis现在的版本开启redis-server后,redis-cli只能访问到127.0.0.1,因为在配置文件中固定了ip,因此需要修改redis.conf(有的 ...
- hadoop最简伪分布式安装
本次安装运行过程使用的是Ubuntu16.04 64位+Hadoop2.5.2+jdk1.7.0_75 Notice: Hadoop2.5.2版本默认只支持64位系统 使用的jdk可以为1.7和1.8 ...
- HashMap 的实现原理(1.8)
详见:https://blog.csdn.net/richard_jason/article/details/53887222 HashMap概述 1.初始容量默认为16 最大为2的30次方,负载因子 ...
- CDN杂谈
两大cdn公司:一个是Akamai,一个是LimeLight,所以有两个阵营 CDN在利用DNS的转授权来引导最终访问者找到最理想的缓存或者镜像点,他是一种基于域名的服务.在不同的实现方式下,最终的定 ...
- Qualcomm_Mobile_OpenCL.pdf 翻译-6-工作组尺寸的性能优化
对于许多kernels来说,工作组大小的调整会是一种简单有效的方法.这章将会介绍基于工作组大小的基础知识,比如如何获取工作组大小,为什么工作组大小非常重要,同时也会讨论关于最优工作组大小的选择和调整的 ...
- 负载均衡实现,一个域名对应多个IP地址【转载】
使用负载均衡实现,传统和常规做法,其他方式需要特殊处理.(dns轮询,或者自己做解析)1.一个域名设定多个dns服务或者服务器进行解析,同一个域名的每个解析都指向不同的ip地址,这样应答快的dns优先 ...
- pikachu-xss和csrf
简介 XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户 XSS漏洞可以用来进行钓鱼攻击.前端js挖矿.盗取用户cookie,甚至对主机进行远程控制 攻击流程 假设存在漏洞的是一个论 ...
- javaIO--数据流之IO流与字节流
0.IO流 0.1.IO(Input Output)流的概念 Java中将不同设备之间的数据传输抽象为“流”:Stream设备指的是:磁盘上的文件,网络连接,另一个主机等等 按流向分:输入流,输出流: ...