图解选择排序与插入排序

上一篇详述了冒泡排序及其优化,有兴趣的可以看看:

如何优化冒泡排序?

一、选择排序(SelectionSort)

  • 算法思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
  • 排序过程:(默认升序)
  1. 从原序列中找到最小值,与数组第一个元素交换;
  2. 除第一个元素外,从剩下未排序的序列中找到最小值,与数组第二个元素交换;
  3. 共N-1趟,每趟都找到未排序的最小值,放到已排序的序列后面。

如图所示,每一趟找到未排序的最小值,并放到有序序列的后面(即当前趟对应于数组中的第几个元素)。

  • java实现选择排序
 private static <T extends Comparable<? super T>> void selectionSort(T[] nums) {
        if (null == nums || nums.length == 0) {
            throw new RuntimeException("数组为null或长度为0");
        }
        int length = nums.length;
        int minValueIndex = 0;
        T temp = null;
        for (int i = 0; i < length - 1; i++) {
            minValueIndex = i;
            for (int j = i + 1; j < length; j++) {
                if (nums[j].compareTo(nums[minValueIndex]) < 0) {
                    minValueIndex = j;
                }
            }
            if (minValueIndex != i) {
                temp = nums[i];
                nums[i] = nums[minValueIndex];
                nums[minValueIndex] = temp;
            }
        }
    }
复制代码
  • 时间、空间复杂度及稳定性分析:
  1. 最好时间复杂度:最好情况是输入序列已经升序排列,需要比较n*(n-1)/2次,但不需要交换元素,即交换次数为:0;所以最好时间复杂度O(n^2)
  2. 最坏时间复杂度:最坏情况是输入序列是逆序的,则每一趟都需要交换。即需要比较n*(n-1)/2次,元素交换次数为:n-1次。所以最坏时间复杂度还是O(n^2)
  3. 平均时间复杂度:O(n^2)
  4. 空间复杂度:只用到一个临时变量,所以空间复杂度O(1)
  5. 稳定性:不稳定排序。如序列3,5,3,1。第一次交换结果为1,5,3,3,我们发现原序列的第一个3排在了第二个3的后面。

二、插入排序(InsertSort)

  • 算法思想:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

  • 排序过程:(默认升序)

    InsertionSort 和打扑克牌时,从牌桌上逐一拿起扑克牌,在手上排序的进程相同。

    举例:

    Input: {4, 3, 8, 5, 2, 6, 1, 7}。

  1. 首先拿起第一张牌, 手上有 {4}。

  2. 拿起第二张牌 3, 把 3insert 到手上的牌 {4}, 得到 {3 ,4}。

  3. 拿起第三张牌 8, 把 8 insert 到手上的牌 {3,4 }, 得到 {3 ,4,8}。

  4. 以此类推。

    插入排序由N-1趟排序组成。对于p=1到N-1趟排序后,插入排序保证从位置0到位置p上的元素为已排序状态。即插入排序利用了从位置0到p-1位置上已经有序的条件,将位置p上的元素向前查找适当的位置插入此元素。

    如图所示:在第p趟,我们将位置p上的元素向左移动,直到它在前p+1个元素(包括当前位置的元素)中的正确位置被找到。

  • java实现插入排序

    private static <T extends Comparable<? super T>> void insertSort(T[] nums) {
          if (null == nums || nums.length == 0) {
              throw new RuntimeException("数组为null或长度为0");
          }
          int length = nums.length;
          T temp = null;
          int i = 0;
          for (int p = 1; p < length; p++) {
              temp = nums[p];
              for (i = p; i > 0 && (temp.compareTo(nums[i - 1]) < 0); i--) {
                  nums[i] = nums[i - 1];
              }
              nums[i] = temp;
          }
      }
    复制代码
  • 时间、空间复杂度及稳定性分析:

  1. 最好时间复杂度:最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需n-1次即可。即最好时间复杂度O(n)
  2. 最坏时间复杂度:最坏情况就是,序列是降序排列,那么总共需要n(n-1)/2次比较;移动次数(赋值操作)是比较次数减去n-1次(因为每一次循环的比较都比赋值多一次,共n-1次循环),即n(n-1)/2 - (n-1);所以最坏时间复杂度O(n^2)
  3. 平均时间复杂度:O(n^2)
  4. 空间复杂度:只用到一个临时变量,所以空间复杂度O(1)
  5. 稳定性:稳定。

三、总结

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。选择排序最好、最坏时间复杂度都为O(n^2),空间复杂度为O(1),属于不稳定排序。

插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千;或者若已知输入元素大致上按照顺序排列,那么插入排序还是一个不错的选择。插入排序最好时间复杂度为O(n)、最坏时间复杂度为O(n^2),空间复杂度为O(1),属于稳定排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2011年上半年网页游戏开测数据报告发布

网页游戏上半年统计数据显示&#xff0c;2011年上半年&#xff0c;网页游戏开测信息总数为304款&#xff0c;排除重复开测信息&#xff0c;在2011年1月1日至6月30日这段期间&#xff0c;共收录开测&#xff08;含首次开测或更名的&#xff09;的数据为129条。 新公布的产品&…

计算机python程序设计导论,程序设计导论:Python计算与应用开发实践(原书第2版)...

程序设计导论&#xff1a;Python计算与应用开发实践(原书第2版)语音编辑锁定讨论上传视频《程序设计导论&#xff1a;Python计算与应用开发实践(原书第2版)》是2018年机械工业出版社出版的图书&#xff0c;作者是[美] 卢博米尔佩尔科维奇(Ljubomir Perkovic)。书 名程序设计…

vue-cli 将被 create-vue 替代?初始化基于 vite 的 vue3 项目为何如此简单?

大家好&#xff0c;我是若川。最近组织了源码共读活动《1个月&#xff0c;200人&#xff0c;一起读了4周源码》&#xff0c;已经有超50人提交了笔记&#xff0c;群里已经有超1500人&#xff0c;感兴趣的可以点此链接扫码加我微信 ruochuan12create-vue公开了&#xff0c;可以使…

lynda ux_如何进入UX领域

lynda uxI often get asked “What is the right path I should take to get into UX?” and more often than not, I do not have a direct answer. I usually ask a lot of questions about their background, before assessing their current skills with the things they …

php字符串学习笔记

在这里记录下今天的所得首先对字符串处理进行分类今天主要记录有以下字符串的格式化字符串的连接与分割字符串的比较使用字符串函数匹配和替换子字符串使用正则表达式1.字符串的格式化<?php //整理字符串的第一步是清理字符串中的多余的空格 // trim() ltrim() rtrim() // …

This is a Blog Test

Blog Test Hello, everyone! I am going to write blog to record the knowledge about the computer technology involved when I study. Please feel free to comment on any mistakes. Thank you! print("Hello")转载于:https://blog.51cto.com/12370958/2379111

可以测试体育跑步的软件,某高校现跑步打卡神器 能检测出是在走还是跑

[摘要]近日&#xff0c;一批高大上的“阳光跑步神器”在东莞一所高校火了&#xff01;之所以称之“神器”&#xff0c;是由于这批机器能检测到你在走路还是在跑步&#xff0c;如果走路数据将中断。消息一出&#xff0c;学生们有赞成&#xff0c;也有大呼“吃不消”。东莞某高校…

一道很熟悉的前端面试题,你怎么答?

大家好&#xff0c;我是若川。最近这几年&#xff0c;云计算的普及和 HTML5 技术的快速发展&#xff0c;越来越多的应用转向了浏览器 / 服务器&#xff08;B/S&#xff09;架构&#xff0c;这种改变让浏览器的重要性与日俱增&#xff0c;视频、音频、游戏几大核心场景也都在逐渐…

:寻找指定和的整数对_寻找时间:如何增加设计的时间

:寻找指定和的整数对Good design derives from good thinking. And good thinking is highly correlated to how much time you spend. In every place I’ve been though, every designer seems to be thirsty for more time to design. Why does this happen, to a point whe…

JavaScript命名空间namespace的实现方法

网上有很多了&#xff0c;这里给出一个&#xff0c;其实思路就是A{}; A.b{};其实b是A的一个属性。只是做了一些封装&#xff0c;最后的效果是可以直接定义多个namespace&#xff1a; 1: My.namespace("Company", "Company.Feed", "Company.Feed.Mess…

通过MySQL存储原理来分析排序和锁

先抛出几个问题1.为什么不建议使用订单号作为主键?2.为什么要在需要排序的字段上加索引?3.for update 的记录不存在会导致锁住全表?4.redolog 和 binlog 有什么区别?5.MySQL 如何回滚一条 sql ?6.char(50) 和 varchar(50) 效果是一样的么?索引知识回顾对于 MySQL 数据库而…

1600k 打印头测试软件,巧修LQ-1600K打印机打印头

LQ-1600K 24针中英文打印机&#xff0c;由于其打印速度快、输出的文字漂亮、软件兼容性好等优点&#xff0c;在国内得到极为广泛的应用。但该机的打印头及打印针驱动电路故障率较高&#xff0c;一旦出现此类故障&#xff0c;打印效果将大打折扣。本人在长期维修工作中&#xff…

linkedin爬虫_重新设计Linkedin的指导功能-用户体验案例研究

linkedin爬虫为什么选择导师 Linkedin平台&#xff1f; (Why mentorship Linkedin platform?) As a recent graduate, I went on Linkedin to seek career advice and mentorship. This idea came so naturally that I was quite surprised by the absence of a complete fea…

POJ 1797 Heavy Transportation 解题报告

分类&#xff1a;图论&#xff0c;生成树&#xff0c;最短路&#xff0c;并查集作者&#xff1a;ACShiryu时间&#xff1a;2011-7-28地址&#xff1a;ACShiryus BlogHeavy TransportationTime Limit: 3000MSMemory Limit: 30000KTotal Submissions: 11929Accepted: 3171Descrip…

曾以为只能拿8K,22届学弟字节校招心路历程

大家好&#xff0c;我是若川。最近组织了源码共读活动《1个月&#xff0c;200人&#xff0c;一起读了4周源码》&#xff0c;已经有超50人提交了笔记&#xff0c;群里已经有超1500人&#xff0c;感兴趣的可以点此链接扫码加我微信 ruochuan12这篇文章记录了江西师大学弟进入字节…

王者荣耀cpu测试软件,你的手机能否玩王者荣耀,主流处理器新版王者荣耀测试...

说道国民级手游&#xff0c;目前来看那绝对是王者荣耀和刺激战场&#xff0c;之前的话那可是王者荣耀的天下&#xff0c;甚至许多手机厂商在发布新手机的时候会专门公布王者荣耀的帧率&#xff0c;可见王者荣耀带来的影响有多大。新版王者荣耀随着王者荣耀的优化和手机系统、硬…

关于MFC遇到的一系列类型转换问题

1.LPTSTR 转换成 CString&#xff1a; (1)直接赋值 CString strText; LPTSTR lpszText _T("LPTSTR >> CString"); strText lpszText; ::MessageBox( NULL, strText , _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );(2)CString::Format()格式化…

大萧条时期什么行业走俏_大流行时期的用户体验

大萧条时期什么行业走俏You’ve read a lot about uncertain times and social distancing. We’re all surrounded by the same words, but what exactly do they mean for the UX people? The nearest future is just the tip of the iceberg. The COVID-19 pandemic is lik…

vsftp虚拟用户无法上传文件,解决办法

vsftp虚拟用户无法上传文件&#xff0c;解决办法 1、打开/etc/vsftpd 目录中的vsftpd.conf文件&#xff0c;查找&#xff1a;guest_usernamexxx&#xff0c;这里指的是vsftpd虚拟用户对应的实 际系统用户。 2、将该xxx用户的R权限赋予想要上传的目录&#xff1a;chown -R xxx.x…

面试官问:来实现一个Promise

大家好&#xff0c;我是若川。最近组织了源码共读活动《1个月&#xff0c;200人&#xff0c;一起读了4周源码》&#xff0c;已经有超50人提交了笔记&#xff0c;群里已经有超1500人&#xff0c;感兴趣的可以点此链接扫码加我微信 ruochuan12 参与&#xff0c;一起学习&#xff…