首页 > 编程语言 >【基础算法】排序算法 —— 选择排序

【基础算法】排序算法 —— 选择排序

时间:2023-10-04 20:55:50浏览次数:32  
标签:arr int 复杂度 选择 算法 排序

一、算法原理

选择排序将数组分为已排序区间未排序区间,每次选择未排序区间的最小元素,将它放到已排序区间末尾。一次选择会让一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序。

 

示例:使用选择排序对数组 arr = [4,5,6,3,2,1] 从小到大排序。

第1次选择:

第2次选择:

第3次选择:

第4次选择:

第5次选择:

第6次选择:

 

二、选择排序优化

思路:选择未排序区间的最小元素,不需要出现小于当前元素的就交换,可以只记住下标,本次选择完成之后再交换,这样每一次选择只需要交换一次,省去了很多次无效交换。

 

三、代码实现

/**
 * 选择排序,时间复杂度 O(n^2),空间复杂度 O(1),不稳定
 *
 * @param arr 待排序数组
 */
public static void selectSort(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }

    for (int i = 0, len = arr.length; i < len - 1; i++) { // 未排序区间的下标
        int min = i; // 选择未排序区间第1个元素为最小元素
        for (int j = i + 1; j < len; j++) { // 一次与之后的元素比较
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        if (min != i) { // 将最小元素交换至已排序区间末尾
            swap(arr, min, i);
        }
    }
}

private static void swap(int[] arr, int i, int j) {
    if (i == j) {
        return;
    }
    arr[i] = arr[i] ^ arr[j];
    arr[j] = arr[i] ^ arr[j];
    arr[i] = arr[i] ^ arr[j];
}

 

四、算法评价

4.1 时间复杂度

选择排序的最好、最坏、平均时间复杂度都是 O(n2),因为不论数组原来是否有序,每次都要从未排序区间找到最小值,而最小值只能通过全部比较一次才能得到。

 

4.2 空间复杂度

选择排序只需要常量级的临时空间,所以它的空间复杂度为 O(1),是一个原地排序算法。

 

4.3 稳定性

选择排序是一种不稳定的排序算法,因为每次都要从未排序区间找最小值,并和前面的元素交换位置,破坏了稳定性。比如,数组 [5,6,5,2,3],第一次找到的最小元素是 2,与第1个 5 交换位置,这样第1个 5 和第2个 5 的顺序已经改变了。

 

标签:arr,int,复杂度,选择,算法,排序
From: https://www.cnblogs.com/luwei0424/p/17742722.html

相关文章

  • 【基础算法】排序算法 —— 冒泡排序
    一、算法原理冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,如果不满足大小关系要求,就进行交换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序。 示例:使用冒泡排序对数组arr=[4,5,6,3,2,1]从小到大排序。第1次......
  • 稳定婚姻问题(Gale-Shapley算法)
    前言今天duck、香饽饽老板和彬彬一起出了个模拟赛,赛时T2想到了跟正解很接近的做法,但最后还是打挂了then喜提0pts,后面duck讲题的时候才知道是稳定婚姻板题。看完证明之后觉得很妙,遂开坑。只是简单整理,图一乐子吧算是。说是稳定婚姻问题,但其实我觉得更合适的叫法是属性稳定分......
  • 【基础算法】排序算法
    一、排序算法简介排序是对批量数据按照一定的顺序进行排列的操作。1.1学习排序算法的要点算法原理、代码实现、评价算法优劣。1.2评价排序算法的优劣排序算法的优劣可以从以下3个方面进行评价:时间性能:最好、最坏、平均时间复杂度;内存占用:是否原地排序,原地排序算法,......
  • eslint airbnb React18+typescript 依赖循环、import自动排序分组
    eslint终极规范爱彼迎eslint-config-airbnb请先阅读完下以下链接在来配置代码规范之什么是eslint,为什么要使用eslinteslint的配置项过多,针对js、ts、vue、jsx、tsx等等不同的规则,小公司或者个人项目可以使用成熟的eslint社区规范,如airbnb、standard、goole等。这里我们介绍......
  • C/C++学习 -- 分组加密算法(DES算法)
    数据加密标准(DataEncryptionStandard,DES)是一种对称密钥加密算法,是信息安全领域的经典之作。本文将深入探讨DES算法的概述、特点、原理,以及提供C语言和C++语言实现DES算法的代码案例。一、DES算法概述DES算法是一种对称密钥加密算法,由IBM于1977年开发并于1977年被美国国家标准局(NI......
  • 02 快速排序(快排)
    #include"stdio.h"voidQuickSort(int*array,intlow,intheight){inti,j,tmp;//两个哨兵,和开头的元素下标inttemp;i=low;j=height;tmp=array[low];if(i>j)//如果下标i大于下标j,函数结束运行{return;}......
  • 视频融合/监控汇聚平台EasyCVR人形检测算法应用汇总
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 排序算法
    在线验证算法排序数组算法实现1.快排思路树的前序遍历。每次选取一个数作基准值,将小于基准值的数放在左边,大于基准值的数放在右边。遍历左子树及右子树,直到只有1个数为止。实现classQuickSort{publicstaticvoidsort(int[]nums){shuffle(nums);......
  • 归并排序算法详解
    算法介绍引用百度百科的介绍。归并排序(MergeSort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表......
  • 算法:线段树
    算法:线段树哦吼!终于来学线段树啦~~拖了好久都没有敢学,主要是基础知识点不熟,代码能力太弱。但是现在已经是时候了。来看:线段树(SegmentTree)几乎是算法竞赛最常用的数据结构了,它主要用于维护区间信息(要求满足结合律)。与树状数组相比,它可以实现\(O(log⁡\n)\)的区间修改,......