Sort Algorithm
记录各个排序算法
Lam Tang
十年编程两茫茫,工期短,需求长。千行代码,Bug何处藏。纵使上线又如何,新版本,继续忙。黑白颠倒没商量,睡地铺,吃食堂。夜半梦醒,无人在身旁。最怕灯火阑珊时,手机响,心里慌。
展开
-
排序算法总结
排序算法作为基础算法,相信大家在学校上C语言课程的时候都接触过一些。笔者这里暂时将之前写的排序算法博客简单的总结一下。冒泡排序及双向冒泡排序选择排序插入排序合并排序(或归并排序)及扩展堆排序快速排序计数排序基数排序桶排序比较排序算法以上算法中的部分算法有个特点,即在排序的最终结果中,各元素的次序依赖于它们之间的比较。这类排序算法称之为比较排序算法。其中上述排序算法...原创 2020-01-11 16:53:34 · 106 阅读 · 0 评论 -
浅谈排序算法之桶排序(9)
本篇博客是今天笔者写的最后一篇排序算法的博客了。桶排序(bucket sort)假设输入数据服从均匀分布,平均情况下其时间代价为O(n)。计数排序假设数据都属于一个小区间的整数,而桶排序则假设数据均匀、独立分布在[0,1)上。桶排序将区间[0,1)划分为n各大小相同的子区间,称之为桶,然后将数组中的所有元素都放在对应的桶中。为了得到排序结果,先对桶中的元素进行排序,然后依次遍历每个桶把桶中的元素...原创 2020-01-11 16:23:20 · 152 阅读 · 0 评论 -
浅谈排序算法之基数排序(8)
基数排序(radix sort)是一种用于卡片排序机上的算法。对待排序数组A,算法先按最低有效位来进行排序,即首先根据所有元素的个位上的值进行排序,然后再根据十位上的值进行排序,直至超过数组中最大元素的宽度。为了确保基数排序算法的正确性,一位数排序算法必须是稳定的,即若两个数的某一位上的值一样,那么排序后这两个数的相对位置也不能发生改变。基数排序只是一种策略,并没有给出具体的代码实现,其伪代码如...原创 2020-01-11 16:02:11 · 241 阅读 · 0 评论 -
浅谈排序算法之计数排序(7)
接下来的三篇博客里,笔者将会简单聊聊三种线性时间复杂度的排序算法,即计数排序、基数排序以及桶排序,均出自《算法导论》。计数排序假设数组A中的所有元素都是0~k区间内的一个整数,其中k为某个整数值。计数排序的思想是对每一个数组元素x,计算小于x的元素的个数。计数排序的实现过程分为三步:计算数组A中每个元素出现的次数。统计数组A中存在多少个元素小于等于A中的指定元素。从后往前依次遍历数组A,...原创 2020-01-11 15:30:17 · 150 阅读 · 0 评论 -
浅谈排序算法之快速排序(6)
忙完论文的事,笔者终于有时间继续学习算法了。以前一直觉得快速排序(Quick Sort)很神秘,今天笔者就学习一下《算法导论》关于快速排序的部分内容。快速排序是一种最快情况时间复杂度为O(n^2)的排序算法,但是其平均性能较好,且为原址排序算法,因此像Java的Arrays类中的静态函数sort就是使用快速排序实现的。与归并排序算法一样,快速排序也是使用了分治思想。对一个数组A[p…r]快速排序...原创 2020-01-11 11:26:35 · 167 阅读 · 0 评论 -
浅谈排序算法之堆排序(5)
近日,笔者忙里偷闲,学习了下堆排序(Heap-Sort)。堆排序算法,就时间复杂度而言,堆排序跟合并排序(Merge-Sort)算法是一样的,都是O(n * log(n));就排序方式而言,堆排序跟插入排序(Insertion-Sort)一样,都具有空间原址性。这里首先介绍下堆的概念。堆,或者称为二叉堆,可以看作是一棵近似的完全二叉树。在这棵树中,除了最底层以外,该树是完全充满的,而且是从左至右...原创 2019-10-26 11:25:29 · 169 阅读 · 0 评论 -
浅谈排序算法之冒泡排序(1)续
今天下午笔者在网上查阅算法时,无意间发现了一个算法,名曰“鸡尾酒排序”。啥?没听过啊,点击去一看,该算法是冒泡排序算法的一种改进。在每一次循环的时候,从当前剩下未排序的数组里选择最小值放在数组前面,最大值放在数组后面(这里的前面与后面指的是在未排序部分)。因此,该算法本身外层迭代次数为数组长度的一半。例如,对于原始数组14, 12, 18, 12, 1, 6, 18, 4, 0, 2, 0...原创 2019-10-24 18:52:17 · 146 阅读 · 0 评论 -
浅谈排序算法之合并排序(4)续
笔者在上一篇博客中谈到了合并排序算法,其是分治思想的一种体现。在《算法导论》后的一道例题上,笔者看到了一道例题如下:假设A[1…n]是一个由n个不同元素构成的数组。若i<j且A[i]>A[j],则对偶(i, j)称为数组A的一个逆序对。给出一个确定在n个元素的任何排列中逆序对数量的算法,最坏的情况是O(n * log(n))(提示,修改合并排序算法)。首先,通过最简单方式,即双...原创 2019-10-17 13:58:23 · 233 阅读 · 0 评论 -
浅谈排序算法之合并排序(4)
在前三篇博客中,笔者分别讲述了冒泡排序、选择排序以及插入排序,这三种排序算法是比较基本算法,原理也好,实现也罢,难度都不是很大。笔者在这篇博客中,打算聊聊归并排序(Merge-Sort)。《算法导论》中提到,归并排序是分治(Divide-and-Conquer)思想的第一个应用。分治思想中,对于一个给定的问题,将该问题分解为多个子问题,每个子问题又可以向下继续分解,直到分解出的子问题十分容易地就...原创 2019-10-16 23:24:32 · 546 阅读 · 0 评论 -
浅谈排序算法之插入排序(3)
笔者在前面两篇文章当中简单介绍了下冒泡排序以及选择排序,这里顺带介绍下插入排序(Insertion-Sort)。举个栗子(出自《算法导论》第三版)。一堆无序的扑克牌,从上面抽取第一张,放在手上,然后抽取第二张,比较和第一张的大小。若小于第一张扑克,则放在第一张扑克的前面,否则放在第一张扑克的后面。然后抽取第三张,若小于第一张扑克,在放在最前面;若大于等于第一张扑克且小于等于第二张扑克,则放在两...原创 2019-10-16 20:22:03 · 138 阅读 · 0 评论 -
浅谈排序算法之选择排序(2)
笔者在上一篇博客中回顾了下冒泡排序(Bubble-Sort),这里写篇博客讲讲选择排序(Selection-Sort)。选择排序在每一次的迭代中,不直接交换相邻元素,而是从数组中选择出当前数组中的最小值(最大值)的索引,并于当前待排序位置的索引进行比较。若不相等,则交换之,亦即会出现如下情况当前最小值: 3 -> [7, 36, 18, 7, 39, 35, 12, 29, 37, 3,...原创 2019-10-16 19:49:39 · 171 阅读 · 0 评论 -
浅谈排序算法之冒泡排序(1)
今日打算入手学习一下算法相关的东西,就先从排序算法说起。冒泡排序(Bubble-Sort)应该是大学里C语言课堂上学到的最早几个排序算法之一的吧。考虑排序后数组为升序排序的情况。冒泡排序,就是在每一次迭代循环中,从当前剩下的数组中选择最小或者最大的值,并将其移动带数组前面或者后面,直到整个数组呈现出升序排序。由于算法本身偏于简单,因此这里就没有动态图来做演示(主要是因为自己不会做)。另外,由于笔...原创 2019-10-16 19:26:47 · 290 阅读 · 0 评论