当前位置: 首页 > news >正文

排序算法之--选择排序

一、原理
每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,3...n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。

二、基本思想
给定数组:int[] arr = {里面有n个数据};第1趟排序,在待排序数据arr[1]arr[n]中选出最小的数据,将它与arr[1]交换;第2趟,在待排序数据arr[2]arr[n]中选出最小的数据,将它与arr[2]交换;以此类推,在i趟待排序数据arr[i]~arr[n]中选出最小的数据,将它与arr[i]交换,直到全部排序完成。

三、举例
数组 int[] arr = {5,2,8,9,1};

第一趟排序:原始数据:5,2,8,9,1
最小数据是1,把1放在首位,也就是1和5互换位置,
排序结果:1,2,8,9,5

第二趟排序:
第1以外的数据{2,8,9,5}进行比较,2最小,不变
排序结果:1,2,8,9,5

第三趟排序:
除1,2以外的数据{8,9,5}进行比较,5最小,5和8互换位置,
排序结果1,2,5,8,9

第四趟排序:
除1,2,5以外的数据{8,9}进行比较,8最小,不变。
排序结果1,2,5,8,9

注:每一趟排序获得最小数的方法:for循环进行比较。

代码实例:

public class SelectionSort {

    public static void sort(int[] arr) {
        int n = arr.length;//数组长度
        for (int i = 0; i < n; i++) {
            //寻找[i,n)区间里的最小值的索引
            int minIndex = i;
            for (int j = i+1; j < n; j++){
                if (arr[j] < arr[minIndex])
                    minIndex = j;
            }
            swap(arr, i, minIndex);
        }
    }

    /**
     * 交换数组位置
     * @param arr
     * @param i
     * @param j
     */
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {10,9,8,7,6,5,3,2,1};
        SelectionSort.sort(arr);
        for (int i = 0; i < arr.length; i++){
            System.out.print(arr[i]);
            System.out.print(" ");
        }
        System.out.println();
    }

相关文章:

  • Shell脚本(2)-if语句
  • spring security reactive获取security context
  • rocketMq概念介绍
  • PHP垃圾回收机制
  • SpringCloud |第三篇: 服务消费者(Feign+REST)
  • Android请求网络数据下载APK安装包
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 技术相对论之软件架构
  • Fragment 生命周期怎么来的?
  • Redis和Memcache和MongoDB简介及区别分析(整理)
  • ubuntu16.4安装最新版wine3.0
  • c++中局部变量初始化的问题
  • WordCount
  • 外卖也智能!美团骑手智能助手的技术与实践
  • 【协议转换和消息路由】camel-spring-boot-starter 实践
  • AngularJS指令开发(1)——参数详解
  • Java多线程(4):使用线程池执行定时任务
  • Java应用性能调优
  • laravel5.5 视图共享数据
  • magento 货币换算
  • Promise初体验
  • Redis字符串类型内部编码剖析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • v-if和v-for连用出现的问题
  • Vue小说阅读器(仿追书神器)
  • 阿里云购买磁盘后挂载
  • 仿天猫超市收藏抛物线动画工具库
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前端
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 赢得Docker挑战最佳实践
  • 中文输入法与React文本输入框的问题与解决方案
  • 最简单的无缝轮播
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • #define 用法
  • #define、const、typedef的差别
  • #NOIP 2014# day.1 T2 联合权值
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (超详细)语音信号处理之特征提取
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)JAVA中的堆栈
  • (转)linux下的时间函数使用
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • **CI中自动类加载的用法总结
  • .aanva
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复