基本原理

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

将数组两个子数组:

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

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

小例子

排序数组:[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. tab 切换 和 BottomNavigationBar 自定义 底部导航条

    BottomNavigationBar 组件    BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold ...

  2. c语言实现面向对象编程

    1.通用校验器接口(validator.h) #ifndef VALIDATOR_H_INCLUDED #define VALIDATOR_H_INCLUDED #include<stdbool ...

  3. 解决Zookeeper无法启动的问题

    在启动zookeeper集群的单个zookeeper节点时总是报如下错误 [root@zookeeper1 zookeeper-3.4.5]# bin/zkServer.sh status JMX e ...

  4. jquery--获取input radio单选框的值

    html <input type="radio" name="sex" value="man" checked> man < ...

  5. 解决 IDEA 下 struts.xml 中 extends="struts-default" 报红的问题

    现象 在IDEA中配置struts.xml时 extends="struts-default" 报红,配置拦截器时属性无预选项提示,也爆红. struts.xml本身的配置并没有错 ...

  6. /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found的解决办法

    #############################BEGIN############################# strings /usr/lib64/libstdc++.so.6.0. ...

  7. Bugku-CTF加密篇之这不是摩斯密码(下载看看吧)

    这不是摩斯密码 下载看看吧  

  8. WLC-安装license

    在CLI界面安装licenseStep 1 Install a license on the controller by entering this command:①license install  ...

  9. VUE项目开发中使用WebSocket

    初始化WebSocket initWebSocket(){ //初始化weosocket const wsuri = 'ws://10.100.45.8:8888/websocket';//ws地址 ...

  10. Monty Hall Problem (三门问题)

    最近有点忙,没怎么写程序...今天突然想起以前看到过的一个问题-三门问题,十分想用程序来模拟一下,于是实在忍不住了就模拟了这个游戏的实验,通过写程序更加加深了我对这个问题的理解,期间也查找了各种相关资 ...