排序--选择排序Selection Sort Java实现
基本原理
选择排序的简单原理:选择排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序。
将数组两个子数组:
- 已排序子数组
- 未排序子数组
选择排序中每次循环都会从未排序子数组中选取最小元素放入已排序子数组
小例子
排序数组:[2,3,6,2,7,5,1,4]
第一次循环:
将[2,3,6,2,7,5,1,4]中最小元素,放到开头
结果:[1,3,6,2,7,5,2,4]
第二次循环:
将[3,6,2,7,5,2,4]中最小元素,放到开头
结果:[1,2,6,3,7,5,2,4]
第三次循环:
将[6,3,7,5,2,4]中的最小元素,放到开头
结果:[1,2,2,3,7,5,6,4]
第四次循环:
将[3,7,5,6,4]中的最小元素,放到开头
结果:[1,2,2,3,7,5,6,4]
第五次循环:
将[7,5,6,4]中的最小元素,放到开头
结果:[1,2,2,3,4,5,6,7]
第六次循环:
将[5,6,7]中的最小元素,放到开头
结果:[1,2,2,3,4,5,6,7]
...
最后排序结果:[1,2,2,3,4,5,6,7]
有序子数组不断扩大,无序子数组不断缩小,最终整个数组都是有序数组
代码实现Java
public static int[] Sort(int[] array){
//记录数组长度
int length = array.length;
//外层循环
for (int i=0;i<length-1;i++){
//将最小数下标记录为i
int min_index = i;
//内层循序 遍历i后边的数组
for (int j=i+1;j<length;j++){
if (array[j]<array[min_index]){
//如果当前遍历到的数小于当前最小索引的对应的值
//将当前的索引赋值给最小索引
min_index = j;
}
}//内层循环 end
//交换i对应值和最小索引对应的值
int temp = array[min_index];
array[min_index] = array[i];
array[i] = temp;
}//外层循环end
return array;
}
算法分析
- 时间复杂度:
O(n^2) - 比较次数
n(n-1)/2 - 交换次数
n-1
选择排序是不稳定的
看下面例子,按照选择排序进行排序:

可以看到,在第一次循环时,两个2 的相对位置就已经发生了改变,显然,选择排序是不稳定的。
完整代码(含排序步骤输出)
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {2,3,6,2,7,5,1,4};
System.out.println("原数组:--------------");
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
int[] arr2 = SortDetail(arr);
System.out.println("排序后数组:----------");
for (int i : arr2) {
System.out.print(i +" ");
}
}
public static int[] Sort(int[] array){
//记录数组长度
int length = array.length;
//外层循环
for (int i=0;i<length-1;i++){
//将最小数下标记录为i
int min_index = i;
//内层循序 遍历i后边的数组
for (int j=i+1;j<length;j++){
if (array[j]<array[min_index]){
//如果当前遍历到的数小于当前最小索引的对应的值
//将当前的索引赋值给最小索引
min_index = j;
}
}//内层循环 end
//交换i对应值和最小索引对应的值
int temp = array[min_index];
array[min_index] = array[i];
array[i] = temp;
}//外层循环end
return array;
}
public static int[] SortDetail(int[] array){
//记录数组长度
int length = array.length;
//外层循环
for (int i=0;i<length-1;i++){
//将最小数下标记录为i
int min_index = i;
System.out.println("----------------------------------------");
System.out.println("第"+(i+1)+"次内层循环(min_index=i="+i+";初始min_index的值:"+array[min_index]+")");
//内层循序 遍历i后边的数组
for (int j=i+1;j<length;j++){
if (array[j]<array[min_index]){
//如果当前遍历到的数小于当前最小索引的对应的值
//将当前的索引赋值给最小索引
min_index = j;
}
}//内层循环 end
System.out.println("内层完成循环的最小索引是:"+min_index + "对应的值为:"+array[min_index]);
//交换i对应值和最小索引对应的值
int temp = array[min_index];
array[min_index] = array[i];
array[i] = temp;
for (int i1 : array) {
System.out.print(i1+" ");
}
System.out.println();
}//外层循环end
return array;
}
}
排序--选择排序Selection Sort Java实现的更多相关文章
- 简单选择排序(Simple Selection Sort)的C语言实现
简单选择排序(Simple Selection Sort)的核心思想是每次选择无序序列最小的数放在有序序列最后 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章, ...
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- 选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 直接选择排序(Straight Selection Sort)
1.定义 选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 常用的选择排序方法有直接选择排序和堆 ...
- 八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 选择排序—简单选择排序(Simple Selection Sort)
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- JAVA排序--[选择排序]
package com.array; public class Sort_Select { /** * 项目名称:选择排序 ; * 项目要求:用JAVA对数组进行排序,并运用选择排序算法; * 作者: ...
- 排序——选择排序(java描述)
百度百科的描述如下:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元 ...
- java实现几种常用排序:选择排序
一.选择排序介绍 选择排序,顾名思义就是用逐个选择的方式来进行排序,逐个选择出数组中的最大(或最小)的元素,直到选择至最后一个元素.此时数组完成了排序. 二.选择排序原理分析 三.选择排序代码实现 / ...
随机推荐
- SaaS paas iaas是什么
saas:软件即服务,必须对云服务商的定价及合同 条款进行仔细审查保证其安全性,如果存在纠纷云商切断服务话企业可能立马面临困境. paas:平台即服务 iaas :基础架构即服务.
- Python使用Tensorflow出现错误: UserWarning: The default mode, 'constant'
Python使用Tensorflow出现错误: UserWarning: The default mode, 'constant', will be changed to 'reflect' in s ...
- SQLite3介绍
一.SQLite数据库简介 SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 是在世界上最广泛部署的 SQL 数据库引擎. DDL - 数 ...
- Django 单元测试笔记
引言 关于单元测试的基本知识这里不再讲述,简单一句话:单元测试是用一段代码去测试另一段代码.最常用的框架是unittest,这是python的单元测试框架,而django单元测试框架test.Test ...
- Oracle_11g_x64的安装与完全卸载
安装: https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html 完全卸载: https://blog.csdn.net/m0_3 ...
- ANSYS单元应用简介1
目录 1. LINK单元 2. BEAM单元 3. PLANE单元 4. SHELL单元 5. SOLIDE单元 6. COMBIN单元 ANSYS中的单元针对不同的应用对象,有着不同的选择方法,下面 ...
- 【JS 日期】获取当前日期时间
获取当前日期时间 <!DOCTYPE html> <html> <head></head> <body> <script> wi ...
- 解决IDEA部署web项目时,jar包拷贝不全的问题
原因 先前已部署过,输出目录有lib文件夹. 再次部署时,IDEA一检测,发现输出目录已经存在lib文件夹,认为已经拷贝过了,为节省时间,不再重新拷贝jar包,殊不知我们新添加了jar包. 于是我们新 ...
- JavaScript判断两个对象内容是否相等
ES6中有一个方法判断两个对象是否相等,这个方法判断是两个对象引用地址是否一致 let obj1= { a: 1 } let obj2 = { a: 1 } console.log(Object.is ...
- 信息论相关概念:熵 交叉熵 KL散度 JS散度
目录 机器学习基础--信息论相关概念总结以及理解 1. 信息量(熵) 2. KL散度 3. 交叉熵 4. JS散度 机器学习基础--信息论相关概念总结以及理解 摘要: 熵(entropy).KL 散度 ...