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

排序算法系列之(零)——排序初体验

前言

一直想总结一下排序这个系列,可总是抽不出大块的时间来整理,算法这个东西没有充足的时间反复磨合是不能完全消化吸收的,回想一下我上一次总结排序算法还是在大学期间的图书馆里,转眼间毕业后工作已经两年多了,我对这些算法又有了不同的理解,有时候会有顿悟的感觉,就是那么突然的一瞬间,仿佛一切都明白了。

内容

说起排序算法,算是我用的比较多的算法之一了,回想当年奋战ACM竞赛的时候,排序是一个无法避开的点,而我用的最多的排序要数冒泡排序了,为什么选择这一个算法呢?原因说起来就是简单粗暴、比较好理解,当时也不明白其中的精髓,说实话这个冒泡算法的结构就是上课的时候背下来的。

后来随着解题中的越来越多的”Time Limit Exceeded”,我渐渐发现冒泡排序这种方法时间复杂度太高了,于是后来接触到了qsort函数,用这个函数排序简单方便,并且运行速度快,冒泡排序也就渐渐的被我淡忘了,但是一些不考效率的小程序我也会用到它的。

关于对排序算法的理解,我认为算法这个东西只有用多了才会有自己的理解,想想我们一开始学习排序的时候,很多同学会把选择排序写成冒泡排序,或者把冒泡排序写成选择排序,明明是两种不同的算法,为什么会用那么多同学把它们写反呢,其实在刚学习的时候我们就是在背算法结构,根本没有多少自己的理解成分,那些勉强没有把算法写串的同学,也会出现把’<’写成’<=’,或者把边界条件写错,不是丢下一个元素不排序,就是数组越界导致程序崩溃。

其实出现上述问题的根本原因就是没有把算法读懂,有人会问,这个究竟需要多少长时间才能完全理解呢?关于这个问题我没办法给出确切的答案,我是今天早上在地铁排队进站的时候想突然明白——“选择排序为什么不叫冒泡,而冒泡排序为什么不叫选择”,这或许就是量变到质变的一种体现。

对比

关于排序算法的总结,网上的文章简直太多了,拿来应付应付考试或者面试还是不错的,但是我想在总结中加入自己的理解,总体思路是采用先分后合方式,即再用三分归晋的总体思路,我们先来聊聊每一种排序,看看他们的由来、特点、以及优缺点,然后再来个总体的对比,当然,期间会加入小对比,比如我们先来说说今天早上我突然冒出想法。

下面来回答一下这个问题——“选择排序为什么不叫冒泡,而冒泡排序为什么不叫选择”,听到这个问题你或许会冒出个想法,我们老师就是这样讲的,这个A算法就是冒泡,那个B算法就是选择,这哪里用说为什么啊,如果你这样想说明你还没有自己的理解。

我来说说我的理解:所谓选择就是从两个及其以上的范围内挑选一个,而选择排序就是利用了这个特点,我们以从小到大的排序为例,选择排序首先在n个元素中找到最小元素的索引,如果索引指向不是第1个元素,就要交换,然后在排除第一个元素的n-1个元素中找到最小元素的索引,尝试与第2个元素交换,以此类推,选择n-1次就完成了一次完整的n个元素的排序,可以说选择排序的名字来源于它所使用的方法。

而冒泡排序的名字来源于它的行为,“冒泡”这个词非常得形象,我们还是以从小到大的排序为例,冒泡排序首先会比较前两个元素,如果前一个元素大于后一个元素,我们就进行交换,然后比较第2个元素和第3个元素,如果还是前一个元素大于后一个元素,我们就进行交换,一直比较到第n-1和第n个元素。假设第一个元素是n个元素中最大的元素,那么这个元素就会通过两两交换n-1次最终被交换到最后,看起来是不是非常像冒泡,依次类推,我们可以通过n-1次冒泡完成n个元素的排序。

总结

相信大家在明白了这两个排序算法的思路以后,应该不会再写反了吧。这一篇总结可以作为整个排序系列的开篇,接下来我会把排序算法依次讲解,我会在其中加入我的思考,希望你能够理解我的想法,至于下一篇我会先总结那个排序,视我心情而定。

相关文章:

  • 光棍节程序员闯关秀-解密
  • Mysql批量删除数据库
  • UE4中的反射机制
  • 排序算法系列之(一)——选择排序清新脱俗的一面
  • C++11(一):在类的定义时初始化非静态变量
  • C++11(二):lamda表达式
  • 可能错误使用了‘offsetof’宏
  • 警告:对 NULL 对象非静态数据成员‘XXX::xxx’的访问无效
  • git tag常用操作
  • error: SEH exception with code 0xc0000005 thrown in the test
  • new对象数组是否会调用对象的构造函数
  • const究竟限制了谁的改变
  • CSDN 论坛板块升级规则
  • poj解题报告——序
  • UE4编辑器修改界面显示语言
  • 《Java编程思想》读书笔记-对象导论
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CSS盒模型深入
  • javascript数组去重/查找/插入/删除
  • Webpack 4x 之路 ( 四 )
  • 包装类对象
  • 高性能JavaScript阅读简记(三)
  • 小程序01:wepy框架整合iview webapp UI
  • 硬币翻转问题,区间操作
  • 优化 Vue 项目编译文件大小
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #{}和${}的区别?
  • #laravel 通过手动安装依赖PHPExcel#
  • #考研#计算机文化知识1(局域网及网络互联)
  • (1)SpringCloud 整合Python
  • (二)斐波那契Fabonacci函数
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)visual stdio 书签功能介绍
  • .gitignore文件_Git:.gitignore
  • .net mvc部分视图
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @GlobalLock注解作用与原理解析
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [Android]How to use FFmpeg to decode Android f...
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [HackMyVM]靶场 Quick3
  • [hdu 4552] 怪盗基德的挑战书
  • [jQuery]10 Things I Learned from the jQuery Source
  • [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
  • [LOJ161] 仙人掌计数
  • [OC]UILabel 文字长的截断方式
  • [Remoting FAQ]Loading a Remoting Host On IIS得到BadImageFormatException
  • [sd_scripts]之train
  • [UE4]性能优化指南(程序向)
  • [UVa11292] Dragon of Loowater
  • [Vue 配置] Vite + Vue3 项目配置和使用 NProgress