前言
排序算法是多用于解决问题的中间步,也是算法中基础而重要的部分。
最近在面试过程中,一旦问到关于算法的内容,就会涉及到排序算法(其中频率较高的是冒泡法排序)和查找算法,今天就先写一下排序方面的内容。虽然都是很基础性的东西,但我觉得里面有很多好的思想和丰富的东西需要我去学习与探索。
现在就粗略地进行归纳。在这篇文章中,会先给出关于算法相关的一些概念。而后的文章,其中包括常见的排序算法的定义、稳定度、复杂度的计算、代码以及各排序算法之间的对比等。
很多内容参考了多种资料然后才归纳,用以深化概念以及与各博友们探讨学习。
相关概念
1.排序概述
排序就是对一串数据(记录),按照索引对各数据按照特定顺序进行重新排序的过程,这对于我们进一步的数据处理等方面的应用很有意义。
而排序算法简单来讲就是一种方法或者思路,如何更快使用更小空间内容地完成数据的排序。
一个排序算法的优劣,可以用完成排序的时间以及所占用的空间来衡量(即复杂度);而另外一个不常被提及的是稳定度。
2.复杂度
复杂度,又分为空间复杂度和时间复杂度。
空间复杂度:
一个算法在运行过程中临时占用存储空间大小的度量。简单理解,就是算法执行过程中需要用到的存储空间大小。
时间复杂度:
简单来讲,就是算法执行所用的时间。
确切来讲,算法的时间复杂度是一个函数。也就是我们对算法以及使用代码进行分析,算出算法中各行代码所需步数以及结合计算机每一步的执行速度来算出一个函数。
通常我们用O来表示一个算法的时间复杂度,由于考察的是输入趋于无穷大的情况(渐近式的),因此经常会忽略函数的低阶项和常数项。
通常我们考察的都是时间复杂度。
3.稳定度
稳定性我也是查找资料的时候才有了解到,下面是来自于360百科(https://baike.so.com/doc/5414131-5652272.html)的解释,感觉讲得比较通俗易懂。
稳定度(稳定性)
一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。
当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。
(4,1)(3,1)(3,7)(5,6)在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:
(3,1)(3,7)(4,1)(5,6) (维持次序)
(3,7)(3,1)(4,1)(5,6) (次序被改变)
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。
看过稳定度的概念后,我的想法是,如果一个算法是非稳定的,就会把原来已经排好序的数据再排一次,这样子至少会影响到算法的时间复杂度;而如果在排序过程中,会用到其他的资源(比如说数据会存在其他变量中),则会增加额外的空间负担。
题外话:今天就先到这里了,第一次写这种博文觉得蛮有趣的,今后请多指教啦~