这里对笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算法原理分析、图解/flash演示/视频演示、算法代码、笔试面试重点分析、笔试面试题等板块。
一、插入排序
1)算法简介
插入排序(Insertion Sort)的算法...
分类:
编程语言 时间:
2015-08-02 23:27:29
阅读次数:
289
计数排序
计数排序假设n个输入元素中的每一个都是介于0到k之间的整数。此处k为某个整数(输入数据在一个小范围内)。
算法思想
计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数。然后再将x直接放置在它在最终输出数组中的位置上。
由于数组中可能有相等的数,在处理时需要注意。
时间复杂度和空间复杂度分析
算法总时间Θ(k + n)。当k=O(n)时,计数排序的...
分类:
编程语言 时间:
2015-08-01 23:35:40
阅读次数:
151
一.概念引入有作者把计数排序也称为桶排序(各个桶中元素的排序采用计数排序),得到数组C后直接从前往后遍历,输出数组值次数组下标,为0就不输出(或者存入原数组,不稳定),不过笔者认为这种说法不严谨(一个很明显的问题是输出会是双重for循环,不过也有那个意思,叫鸽巢排序也未尝不可),因为桶排序要求输入数据在[0,1)范围内(计数排序要求整数;实际上要么全是整数,要么小数,便于划分桶)...
分类:
编程语言 时间:
2015-07-31 16:18:24
阅读次数:
106
1. 桶排序介绍 桶排序(Bucket sort)是一种基于计数的排序算法,工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。当要被排序的数据内的数值是均匀分配的时候,桶排序时间复杂度为Θ(n)。桶排序不同于快速排序,并不是...
分类:
编程语言 时间:
2015-07-23 23:24:36
阅读次数:
213
从《基于比较的排序结构总结》中我们知道:全依赖“比较”操作的排序算法时间复杂度的一个下界O(N*logN)。但确实存在更快的算法。这些算法并不是不用“比较”操作,也不是想办法将比较操作的次数减少到 logN。而是利用对待排数据的某些限定性假设,来避免绝大多数的“比较”操作。桶排序就是这样的原理。桶排...
分类:
编程语言 时间:
2015-07-22 12:40:28
阅读次数:
172
基数排序
计数排序
桶排序基数排序,桶排序,计数排序是三种线性排序方法,突破了比较排序的O(nlogn)的限制。但是只适用于特定的情况。基数排序以下为维基百科的描述:
基数排序 :
将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
基数排序的方式可以采用L...
分类:
编程语言 时间:
2015-07-20 13:01:28
阅读次数:
164
桶排序的基本思想现在有一个数组A,这个数组有size个元素,元素的范围为0~MAX。要求对这size个数据进行排序。建立一个大小为MAX+1的数组B,每一个元素都为0。从头开始遍历A,当遍历到A[i]的时候,令B[A[i]]的值加1;当把A整个扫面结束之后,输出B就得到了最后的排序结果。一个桶排序的...
分类:
编程语言 时间:
2015-07-12 12:41:41
阅读次数:
157
上一节的冒泡排序可以说是我们学习第一个真正的排序算法,并且解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到了O(N2)。假如我们的计算机每秒钟可以运行10亿次,那么对1亿个数进行排序,桶排序则只需要0.1秒,而冒泡排序则需要1千万秒,达到115天之久,是不是很吓人。那...
分类:
编程语言 时间:
2015-07-11 21:19:35
阅读次数:
137
桶排序①简介 桶排序假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。桶排序假设输入是由一个随机过程产生,该过程将元素均匀,独立的分布在[0,1)区间上。②原理 桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后将n个输入的数据分别放到各个桶中。因为输入数据是均匀分布的,一般不会出现很多数落在一个桶中的情况。为了得到输出结果,先对每个桶中的数据进行排序,再遍历每个...
分类:
编程语言 时间:
2015-07-01 10:07:44
阅读次数:
142
在此对于桶排序做出两种方法:
一.简化版桶排序
代码如下:
/*简化版的桶排序*/
#include
int main()
{
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++)
{
book[i]=0;
}
scanf("%d",&n);//输入一个数n,表示接下来有n个数
for(i=1;i<=n;i++)//循环读入n个数,并进...
分类:
编程语言 时间:
2015-06-26 09:16:59
阅读次数:
130