基本原理

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

将数组两个子数组:

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

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

小例子

排序数组:[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. Jmeter_接口串联自动化测试_登录后充值获取cookie

    1.登陆->充值->运行会报错 2,那如何解决这个问题呢,添加HTTP COokie管理器 另外一种方法,登录->提取正则表达式,充值->添加HTTP cookie管理器

  2. mac机器smb映射

    1  finder中打开前往 2  输入:smb://10.216.90.*  链接 3  输入 账户和密码(名称和密码是你机器的smb密码:比如123***)

  3. 创业学习---《预判项目的长期壁垒》--B-3.预判模块---HHR计划---以太一堂

    一,<开始学习> 1,投资人经常会问CEO:你的项目的长期壁垒是什么?你是怎么思考的? 2,三个预热思考题: (1)突然有一天,大公司要抄你,你会怎么办?  答:用增长技术来和他竞争. ( ...

  4. 【代码学习】PYTHON 文件I/O

    一.文件的打开和关闭 open(文件名,访问模式) cloese() 模式 描述 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针 ...

  5. 29 对象&函数

    switch: 穿越: 没有判断结果的情况下执行下一个case的语句块,叫穿越 或者穿越: switch(s%10){ case 1: case 2: case 3: s++; break; defa ...

  6. Mac 下 vim 常用命令

    vim 三种模式:命令模式.插入模式.底线命令模式. 切换模式: 命令模式: 启动 vim 进入命令模式: i 切换到插入模式,以输入字符. x   删除当前光标所在处的字符. :   切换到底线命令 ...

  7. 「NOI2006」最大获利

    「NOI2006」最大获利 传送门 最小割. 对于每一组用户群 \(A_i, B_i, C_i\) ,连边 $S \to A_i, S \to B_i, $ 容量为成本,还有 \(i \to T\) ...

  8. Mysql基本用法-存储引擎-04

    MYSQL中只有 INNODB和BDB 类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!) Mysql基本用法-存储引擎-02中的test_user表 和 phpcvs表 <?php ...

  9. 1123. Lowest Common Ancestor of Deepest Leaves

    link to problem Description: Given a rooted binary tree, return the lowest common ancestor of its de ...

  10. 改写画质、突破性能, Unity 全面升级!

    技术变革,时代更迭.从<神庙逃亡>.<暗影之枪>等主流手游到独立联网的大型游戏,从绚丽多彩的影视动画到具备极致体验的运输建筑制造行业,从传统的2D 到立体3D 乃至沉浸式的VR ...