首页 > 其他分享 >选择排序

选择排序

时间:2022-10-13 20:13:41浏览次数:62  
标签:minIndex 标记 元素 选择 numbers 排序 比较

选择排序

代码

import java.util.Arrays;

public class SelectionSort {
    public static void main(String[] args) {
        int[] numbers = { 3, 1, 4, 2, 6, 5 };
        System.out.println("排序前的数组为:" + Arrays.toString(numbers));
        // 记录每一轮比较的最小值下标
        int minIndex = 0;
        // 外层循环控制比较轮数
        for (int i = 0; i < numbers.length - 1; i++) {
            minIndex = i;
            // 内层循环控制每轮中的比较
            for (int j = i + 1; j < numbers.length; j++) {
                // 如果被比较的数小于当前下标的数,则改变下标
                if (numbers[minIndex] > numbers[j]) {
                    minIndex = j;
                }
                //  当下标发生改变则边换一次数值
                if (minIndex != i) {
                    numbers[minIndex] += numbers[i];
                    numbers[i] = numbers[minIndex] - numbers[i];
                    numbers[minIndex] -= numbers[i];
                }
            }
        }
        System.out.println("排序后的数组为:" + Arrays.toString(numbers));
    }
}

输出效果为:

排序前的数组为:[3, 1, 4, 2, 6, 5]

排序后的数组为:[1, 2, 3, 4, 5, 6]

释义

选择排序,每轮排序从待排序元素中选出极值,存放到序列起始位置,接着从剩余元素选出极值,放在序列已排序元素的后面,直至元素排序完毕。

以[3, 1, 4, 2, 6, 5]为例将选择排序逐步理顺。
第一轮,共比较五次:
[3, 1, 4, 2, 6, 5] minIndex = 0初始
[3, 1, 4, 2, 6, 5] minIndex = 13跟1比,1小,标记改变
[3, 1, 4, 2, 6, 5] minIndex = 11跟4比,1小,标记不变
[3, 1, 4, 2, 6, 5] minIndex = 13跟2比,1小,标记不变
[3, 1, 4, 2, 6, 5] minIndex = 13跟6比,1小,标记不变
[3, 1, 4, 2, 6, 5] minIndex = 13跟5比,1小,标记不变
[1, 3, 4, 2, 6, 5]第一轮比较结束选出最小元素跟下标元素交换位置

第二轮,共比较4次,最小元素已选出,比较中隐藏。
[3, 4, 2, 6, 5] minIndex = 1初始
[3, 4, 2, 6, 5] minIndex = 13跟4比,3小,标记不变
[3, 4, 2, 6, 5] minIndex = 33跟2比,2小,标记改变
[3, 4, 2, 6, 5] minIndex = 32跟6比,2小,标记不变
[3, 4, 2, 6, 5] minIndex = 32跟5比,2小,标记不变
[2, 4, 3, 6, 5]第二轮比较结束选出最小元素跟下标元素交换位置

第三轮,共比较3次:
[4, 3, 6, 5] minIndex = 2初始
[4, 3, 6, 5] minIndex = 34跟3比,3小,标记改变
[4, 3, 6, 5] minIndex = 33跟6比,3小,标记不变
[4, 3, 6, 5] minIndex = 33跟5比,3小,标记不变
[3, 4, 6, 5]第三轮比较结束选出最小元素跟下标元素交换位置

第四轮,共比较2次:
[4, 6, 5] minIndex = 3初始
[4, 6, 5] minIndex = 34跟6比,4小,标记不变
[4, 6, 5] minIndex = 34跟5比,4小,标记不变
[4, 6, 5]第四轮比较结束,下标没发生变化,不交换位置

第五轮,共比较1次:
[6, 5] minIndex = 4初始
[6, 5] minIndex = 56跟5比,5小,标记改变
[5, 6]第五轮比较结束元素交换位置

经过五轮的比较,排序完成得到序列[1, 2, 3, 4, 5, 6]。

外层循环控制比较轮数,假设有N个元素待比较,循环的次数应该是N-1。
条件为int i = 0; i < numbers.length - 1; i++
内层循环控制每轮比较的次数。每轮比较的初始下标与后面的元素比较比较到最后一个元素。
条件为int j = i + 1; j < numbers.length; j++

总结

选择排序的比较次数在0n-1之间,比较次数为n(n-1)/2次,赋值操作介于03(n-1)次之间。交换次数比冒泡排序较少,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。

平均时间复杂度:O(n²)
最坏时间复杂度:O(n²)
最好时间复杂度:O(n)
空间复杂度:O(1)

选择排序是一种不稳定的排序算法,两个相同数值的顺序可能会发生变化。

原地操作几乎是选择排序的唯一优点,当空间复杂度要求较高时,可以考虑选择排序;实际适用的场合非常罕见。

标签:minIndex,标记,元素,选择,numbers,排序,比较
From: https://www.cnblogs.com/isxh/p/16789479.html

相关文章

  • if 双向选择结构语法
    packagecom.shaonian.struct;importjava.util.Scanner;publicclassIFDemo02{publicstaticvoidmain(String[]args){//考试分数大于60及格,小于60不及......
  • 769. 最多能完成排序的块
    解题思路:首先明确一个观念,排好序的arr中arr[i]=i;而如果出现了位置arr[i]≠i,则说明至少i位置到arr[i]位置都是无序的;而如果从i位置到arr[i]位置中有比arr[i]......
  • 排序和过滤源码分析,RBAC的介绍和使用,后台管理simplui的介绍和使用
    1.排序和过滤源码分析#继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序-drf内置的过滤类(SearchFilter),排序类(Ordering......
  • 冒泡排序(对于数组元素较少的可以采用这种方法进行比较)
    对于数组个数比较少的,我们可以采用冒泡排序的方法来进行排序,他的原理其实是利用两层循环来进行比较,如果n个数要进行排序,那至少要进行n-1次的回合,而且每次需要排n-i次,就像吐......
  • vue拖拽排序功能
    实现效果(可以拖拽排序)  实现步骤一:安装依赖npminstallvuedraggable--save二:在页面中引入importdraggablefrom"vuedraggable";components:{draggab......
  • 老牌浏览器已非最佳选择? 新生国产浏览器值得一试
    国内老牌浏览器用户数量众多,但比如360安全浏览器,QQ浏览器等、百度浏览器,UC等大厂浏览器,变的日益臃肿,更加让使用者苦不堪言,它们都成了各式流量的入口。虽然这些厂商都推出过......
  • 【Mysql】 查询数据排序以及聚合函数
    #排序#orderby字段#asc从小到大排序,即升序#desc从大到小排序,即降序#查询年龄在18到34岁之间的男性,按照年龄从小到大排序select*fromstudentswhere......
  • 为什么选择高防DNS云解析?(一)
    ​DNS(domainnameserver, 域名服务器)是互联网的一项核心服务,是进行域名与之对应的IP地址之间转换的系统,可将易于记忆的域名转换为方便服务器识别的用于互连通信的数字IP地......
  • 为什么选择高防DNS云解析?(一)
    DNS(domainnameserver, 域名服务器)是互联网的一项核心服务,是进行域名与之对应的IP地址之间转换的系统,可将易于记忆的域名转换为方便服务器识别的用于互连通信的数字IP地......
  • MySql多字段排序
    我们平常工作中需求可能会要求表格某些数据会挨一起的,这样比较好比较的,这个就涉及到了MySQL多列排序问题ORDERBYlcl.id,ldt.id,lpe.weight_max上面需要排序的列越往前......