思路:就是把所有数据项扫描一遍,挑出最小的那个和最左边的交换位置,即放到0位置。现在最左边的就是有序得了,不需要在交换位置,再次扫描数据时就是从1开始,还是寻找最小的和1交换位置,直到所有数据都是有序的。选择排序的比较次数与冒泡排序相同,都是N-1次(https://www.cnblogs.com/zouwangblog/p/10984663.html),但是交换次数少于冒泡排序,每趟排序只有最后一次交换,前面的比较都是下标赋值

下面举例说明:

int[] arg = {6,3,8,2,9,1}

int min = 0

第一趟排序:

     第一次3和6比较,3小于6,min = 1

     第二次从min=1开始比较:8和3比较,8大于3,继续不赋值

第三次2和3比较,2小于3,min = 3

第四次从min = 3开始比较,9大于2,继续不赋值

第五次1和2比较,1小于2,min = 5

将下标0和下标5进行交换

    第一趟总共进行了 5次比较  1次交换, 排序结果:      1,3,8,2,9,6


第二趟排序(从3开始向后比较):

      第一次3和8比较,8大于3,继续不赋值

第二次2和3比较,2小于3,min = 3

第三次从min = 3开始比较,9 大于2,继续不赋值

第四次从min = 3开始比较,6大于2,不赋值,循环结束

将下标1和下标3进行交换

    第二趟总共进行了4次比较 1次交换, 排序结果:    1,2,8,3,9,6


第三趟排序(从8开始向后比较):

     第一次3和8比较,3小于8,min = 3

第二次从min = 3开始比较,9大于3,继续不赋值

第三次从min = 3开始比较,6大于4,继续不赋值结束循环

将下标2和下标3进行交换,

    第二趟总共进行了3次比较 1次交换, 排序结果:       1,2,3,8,9,6


第四趟排序(从8开始向后比较):

    第一次8和9比较,9大于8,继续不赋值

第二次8和6比较,6小于8,min = 5结束循环

将下标3和下标5进行交换

    第二趟总共进行了2次比较 1次交换, 排序结果:        1,2,3,6,8,9


第五趟排序(从8开始向后比较):

      第一次8和9比较,9大于8,不赋值结束循环

    第二趟总共进行了1次比较 0次交换, 排序结果:  1,2,3,6,8,9


 代码实现:

外层循环用变量out,从数组开头开始(数组下标为0)向高位增长。内层循环用循环变量in,从out所指位置开始,同样是向右移位,在每一个in的新位置数据项array[in]和array[min]进行比较,如果a[in]更小,则min被赋值为in的值,在内层循环的最后,min被指向最小的值,然后交换out和min指向的数组数据项

 public static void selectSort(int[] array) {
        int out,in,min = 0;
        for (out = 0; out<array.length-1; out++) {
            min = out;
            for (in = out; in<array.length; in++) {
                if (array[in] < array[min]) {
                    min = in;
                }
            }
            swap(out, min);
        }
    }

public static void swap(int one, int two) {
        int temp = ii[one];
        ii[one] = ii[two];
        ii[two] = temp;
    }

不变性:下标小于或等于out位置的数据总是有序的

Java经典算法之选择排序(Select Sort)的更多相关文章

  1. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  2. java基础算法之选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. ...

  3. 【排序算法】选择排序(Selection sort)

    0. 说明 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最 ...

  4. Java实现算法之--选择排序

    选择排序也是比較简单的一种排序方法,原理也比較easy理解,它与冒泡排序的比較次数同样,但选择排序的交换次数少于冒泡排序.冒泡排序是在每次比較之后,若比較的两个元素顺序与待排序顺序相反,则要进行交换, ...

  5. Java经典算法之插入排序(Insert Sort)

    插入排序在局部有序的情况下比冒泡排序快一倍,比选择排序快一点. 那什么是插入排序,就是将局部有序的数据向右移动,将未排序的数据插到他的前面 下面我们来解析代码: 这里外层循环out变量从1开始向右移动 ...

  6. 基础算法之选择排序Selection Sort

    原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕.一种简单直观的排序算 ...

  7. Java经典算法之冒泡排序(Bubble Sort)

    原理:比较相邻的两个值,将值大的元素交换至右端 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数 ...

  8. 排序算法 - 选择排序(selection sort)

    选择排序(Selection sort)跟插入排序一样,也是O(n^2)的复杂度,这个排序方式也可以用我们的扑克牌来解释. 概念 桌面上有一堆牌,也是杂乱无章的,现在我们想将牌由小到大排序,如果使用选 ...

  9. 【DS】排序算法之选择排序(Selection Sort)

    一.算法思想 选择排序是一种简单直观的排序算法.它的工作原理如下: 1)将序列分成两部分,前半部分是已经排序的序列,后半部分是未排序的序列: 2)在未排序序列中找到最小(大)元素,放到已排序序列的末尾 ...

随机推荐

  1. [Python数据结构] 使用 Circular List实现Queue

    [Python数据结构] 使用 Circular List实现Queue 1. Queue队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体 ...

  2. Linux 应用总结:自动删除n天前的日志

    linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...

  3. Java 字符串总结

    三种字符串类:String,StringBuilder,StringBuffer String类 1. 常用构造器 构造器   public String(char value[])   public ...

  4. CodeForcesGym 100753F Divisions

    Divisions Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. Or ...

  5. 九度oj 题目1053:互换最大最小数

    题目1053:互换最大最小数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7538 解决:3049 题目描述: 输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后 ...

  6. noip模拟赛 寻宝之后

    题目背景 还记得NOIP2011的寻宝吗?6年之后,小明带着他的妹子小芳,再次走上了寻宝的道路. 然而这次他们寻宝回来之后,小明被困在了一个迷宫中. 题目描述 迷宫是一个n*m的字符矩阵. 小明在这个 ...

  7. [K/3Cloud]关于"选单"操作

    之前有些人对这块有些疑问,比如: 1.选单操作是否和下推基本一样,都是公用同一套单据转换规则,只不过下推是源单推目标单,选单是目标单去选择源单,最终操作结果一样? 2,我想实现选单的时候,选单列表先通 ...

  8. 小L 的二叉树(洛谷 U4727)

    题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...

  9. Win32编程API 基础篇 -- 3.消息处理 根据英文教程翻译

    消息处理 例子:窗口点击 好的,现在我们已经得到一个窗口了,但我们什么也做不了除了DefWindowProc()允许窗口大小被调整,最大最小化等...这不是很激动人心啊 在接下来的一小节中我将向你展示 ...

  10. CI 日志类

    开发ci的过程中,使用log能直观的看出代码运行到哪,还可设置代码查看数据接口的发送情况.日志类: <?php defined('BASEPATH') OR exit('No direct sc ...