IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 【算法】排序_选择排序及其优化 -> 正文阅读

[开发测试]【算法】排序_选择排序及其优化

选择排序

定义

从待排序的数据元素中选出最小(或最大的一个元素),存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
以此类推,直到全部待排序的数据元素的个数为0.

稳定性

不稳定

时间复杂度

O(N2)

代码

测试用例

int arr[] = {2,4,3,1,6,5};

交换函数

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

原代码

    /**
     * 选择排序
     * @param arr
     * @param len
     */
    public static void selectSort(int arr[],int len){
        int minIndex; // 记录最小元素的下标
        // 极限是倒数第二个元素
        for (int i = 0;i<len-1;i++){
            System.out.println("\n第"+(i+1)+"轮");
            minIndex = i;
            // 极限是最后一个元素
            for (int j = i+1;j<len;j++){
                if (arr[minIndex]>arr[j]){
                    minIndex = j; // 更新最小元素下标
                    System.out.println("较小元素:["+arr[minIndex]+"]; 较小元素下标:"+minIndex);
                }
            }
            // 将较小的元素放到前面 达到排序目的
            swap(arr,i,minIndex);
            System.out.println("第"+(i+1)+"次交换:" + Arrays.toString(arr));
        }
    }

运行结果
在这里插入图片描述

优化

每轮遍历会找出最大值和最小值 然后将其放到按照排序应放置的位置,下一轮循环的时候,已经处理过的值(首尾)不会再被遍历到
i记录每次开始遍历的位置 前i个后i个都不会被遍历到,因为在上轮遍历中已经有序
这样可以减少将近一半的循环遍历

    /**
     * 选择排序
     * 第一次优化
     * 找出最大最小值
     * 每轮循环都会将首尾排好
     * @param arr
     * @param len
     */
    public static void selectSortOptimize1(int arr[],int len){
        System.out.println("初始状态 " + Arrays.toString(arr));
        int minIndex = 0; // 记录较小值的下标
        int maxIndex = 0; // 记录较大值的下标
        // 极限是倒数第二个元素
        for (int i = 0;i<len/2;i++){
            System.out.println("\n第"+(i+1)+"轮");
            minIndex = i; // 本轮较小元素目标位置
            maxIndex = len-1-i; // 本轮较大元素目标位置
            // 极限是最后一个元素
            for (int j = i+1;j<len-i;j++){
                if (arr[minIndex]>arr[j]){
                    minIndex = j; // 更新较小元素下标
                }
                if (arr[maxIndex]<arr[j]){
                    maxIndex = j; // 更新较大元素下标
                }
            }
            System.out.println("较小元素:["+arr[minIndex]+"]; 较小元素下标:"+minIndex);
            System.out.println("较大元素:["+arr[maxIndex]+"]; 较大元素下标:"+maxIndex);

            swap(arr,i,minIndex); // 将较小的元素放到前面 达到排序目的
            swap(arr,len-1-i,maxIndex); // 将较大的元素放到后面 达到排序目的
            System.out.println("第"+(i+1)+"次交换:" + Arrays.toString(arr));
        }
    }

运行结果
在这里插入图片描述

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:34:55  更:2021-08-13 12:35:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:51:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码