基本原理

选择排序的简单原理:选择排序算法通过从未排序部分重复查找最小元素(考虑升序)并将其放在开头来对数组进行排序。

将数组两个子数组:

  • 已排序子数组
  • 未排序子数组

选择排序中每次循环都会从未排序子数组中选取最小元素放入已排序子数组

小例子

排序数组:[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实现的更多相关文章

  1. 简单选择排序(Simple Selection Sort)的C语言实现

    简单选择排序(Simple Selection Sort)的核心思想是每次选择无序序列最小的数放在有序序列最后 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章, ...

  2. 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

    跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...

  3. 选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  4. 直接选择排序(Straight Selection Sort)

    1.定义 选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 常用的选择排序方法有直接选择排序和堆 ...

  5. 八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  6. 选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  7. JAVA排序--[选择排序]

    package com.array; public class Sort_Select { /** * 项目名称:选择排序 ; * 项目要求:用JAVA对数组进行排序,并运用选择排序算法; * 作者: ...

  8. 排序——选择排序(java描述)

    百度百科的描述如下:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元 ...

  9. java实现几种常用排序:选择排序

    一.选择排序介绍 选择排序,顾名思义就是用逐个选择的方式来进行排序,逐个选择出数组中的最大(或最小)的元素,直到选择至最后一个元素.此时数组完成了排序. 二.选择排序原理分析 三.选择排序代码实现 / ...

随机推荐

  1. Idea 工具快捷合集

    官方下载地址 https://www.jetbrains.com/idea/download/#section=windows 商业版 与 社区版,商业版具有更多的功能 快捷一.修改 terminal ...

  2. mysql设置定时任务(对于中控心跳包的实现有意义)

    转载:https://www.cnblogs.com/laowu-blog/p/5073665.html 目前用途:因为 脚本正常开关会给中控发送消息 但是万一脚本被强制关闭 没有触发脚本关闭事件就无 ...

  3. 360安全浏览器已经完成和统一操作系统UOS的适配工作

    导读 统信软件公司宣布,360安全浏览器已经完成和统一操作系统UOS的适配工作.如今,基于龙芯.兆芯.飞腾.海光等国产CPU的统一操作系统UOS,赢全面支持电子公文.电子签章.流版式办公插件等近百款国 ...

  4. ubuntu的apt

    1. apt edit-sources  #编辑apt的源列表( 或者直接写这个命令:vim /etc/apt/sources.list ) 2. apt list   #列出包含条件的包(已安装,可 ...

  5. https://www.cnblogs.com/lfs2640666960/p/8529115.html

    https://www.cnblogs.com/lfs2640666960/p/8529115.html

  6. 9000端口号被上一个ip地址占用,需要reboot才可以恢复正常ip端口问题

    比如查看端口# lsof -i:9000 本机ip已经修改为192.168.0.50,而经过# lsof -i:9000查看到,端口是这样的,192.168.0.88:9000,显示的还是上一个ip的 ...

  7. JQuery常用CSS操作

    JQuery常用CSS操作 $(elem).css(obj):设置行内样式 $(elem).position():返回相对于父容器位置,只能获取不能设置 $(elem).offset(obj):返回相 ...

  8. AOP统一日志打印处理

    在日常开发工作中,我们免不了要打印很多log.而大部分需要输出的log又是重复的(例如传入参数,返回值).因此,通过AOP方式来进行日志管理可以减少很多代码量,也更加优雅. Springboot通过A ...

  9. Cisco AP-了解AP镜像

    Understanding Access Point OS Images IntroductionAll Cisco Aironet 802.11a/b/g/n and 11ac Wave 1 wir ...

  10. 导入jeesite 项目

    1:从开源中国用git方式下载jeesite源码 链接https://gitee.com/thinkgem/jeesite    gti 地址:https://gitee.com/thinkgem/j ...