基本原理

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

将数组两个子数组:

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

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

小例子

排序数组:[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. php自动读取文件夹下所有图片

    $path = 'xxxxx';///当前目录$handle = opendir($path); //当前目录while (false !== ($file = readdir($handle))) ...

  2. 【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第56章       STM32H7的DMA2D应用之刷色块, ...

  3. buuctf——easyjava

    虽然学过Javaweb的开发,但没好好学,所以对Javaweb了解不深 菜的真实 WEB-INF/web.xml泄露 贴一个别人的源码泄露总结ctf/web源码泄露及利用办法[总结中] WEB-INF ...

  4. SpringBoot与Shiro整合

    一.数据库设计 ​ 这里主要涉及到五张表:用户表,角色表(用户所拥有的角色),权限表(角色所涉及到的权限),用户-角色表(用户和角色是多对多的),角色-权限表(角色和权限是多对多的).表结构建立的sq ...

  5. PHP将json或对象转成数组

    今天老大突然给了我一个小任务,给我一个txt文件,里边是很多的json字串,要求将这些字串转换成php中的数组: 于是开足火力,用了将进5分钟的时间完成了任务,代码如下: $jsonStr = fil ...

  6. PyQt5单元格操作大全

    1.显示二维列表数据(QTableView)控件 '''显示二维列表数据(QTableView)控件数据源model需要创建一个QTableView实例和一个数据源model,然后将其两者关联 MVC ...

  7. 加载Properties配置文件

    /** * 加载Properties配置文件 * * @author ZhangHaiNing * @param file 要读取的文件 * @return */ public static Prop ...

  8. 洛谷 P5019 铺设道路(差分)

    嗯... 题目链接:https://www.luogu.org/problem/P5019 首先简化一下题意: 给定一个长为N的数组,每次操作可以选择一个区间减去1,问最少多少次操作可以将数组中的数全 ...

  9. 如何用 pycharm 调试 airflow

    airflow 和 pycharm 相关基础知识请看其他博客 我们在使用 airflow的 dag时. 每次写完不知道对不对的,总不能到页面环境中跑一下,等到报错再调试吧.这是很让人恼火的事情 这里我 ...

  10. WebRTC之Android客户端

    一.WebRTC的Android客户端搭建 1.libjingle_peerconnection_so.so 2.libjingle_peerconnection.jar 3.客户端源码一份(可以在g ...