基2快排原理与代码

原创 2005年03月01日 05:04:00

基2快排实际上是基数排序,因为它速度特别快。是O(n)级的,所以偶叫他基2快排 :)


它的基本原理是桶排,不过大家想必知道桶排有多么吃内存....想要排32位的整数需要4GB的BUFFER....恐怖吧~所以只好以时间换空间~减少空间开销,多画一点时间了。基数排序其实就是多趟桶排。


什么是基数排序?基数大家都应该知道....比如说10进制的基数就是10。我们比较10进制的数是怎么比较的?肯定是先看最高位,然后向个位发展...基数排序和这个原理是一样的。不过我们比较喜欢选择用2的整数次幂作为基数~因为除以2的整数次幂的时候可以用位移~


OK。废话不多说。来说一下基2快排函数的思路(以下都是伪代码)。


我们假设函数入口传入了原数组src以及长度N。那么,肯定要开一个计数器(因为毕竟是基于桶排的嘛~) count,还有一个临时数组temp[N]。我们以2^8作为基数,排序32位整数为例。


for 4 次(i=0,1,2,3)
{
ZeroMemory(count); //显然是要清空计数器的
memcpy(temp,src,n*4);//以后的操作都是对temp操作的,最后以temp为原拷贝回src去
For k=0 to N-1
{
  ++count[(temp[k]>>(8*i))&0xFF];//在这里进行桶排
}


entry_point=0;//这个变量记录了每个计数器数据经过排列后在数组中的位置


for k = 0 to 256
{
_temp=count[k];
count[k]=entry_point; //把相应数据个数变成了相应数据在数组中的位置
entry_point+=_temp; //显然是要把BASE ENTRY_POINT推后的~
}


for k=0 To N
src[count[(temp[k]>>(8*i))&0xFF]++]=temp[k]; //这里有点难理解。这个语句的意思是根据数组中这个数字相应“位”(相当于10进制的个位、十位)的位置把这个数字拷贝回原数组中,这样就对这个“位”排过序了


}


最后送上例子代码……可能有错……而且大家可以看到偶的语文水平确实8行,欢迎大家拍偶的砖

快排的java两种实现方式

快排是最基础的几个排序算法之一,今天再来
  • qarkly112649
  • qarkly112649
  • 2014年06月29日 17:24
  • 29431

基2与基4时间抽取fft算法

基2时间抽取FFT计算 DFT变换定义: IDFT变换定义: 基2算法,序列的长度是为2的幂,序列的DFT为。序列可以由奇序列和偶序列组成,它们的DFT分别为和。 假设x[2r]和...
  • wordwarwordwar
  • wordwarwordwar
  • 2016年11月24日 23:42
  • 3054

快速排序原理剖析

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6  1  2 7  9  3  4  5 10  ...
  • yzllz001
  • yzllz001
  • 2016年03月25日 17:35
  • 9971

快排算法及常见两种常见优化方法

csdn博客同步发布正常快排最近在找实习,然而我觉得博客还是要坚持日更,我相信时间总是挤出来的,不扯淡了,快排这是个面试常考题,今天主要着重于讲他的优化方法,那我就直接先贴快排代码,再来细细道来我所知...
  • sinat_28676875
  • sinat_28676875
  • 2017年04月05日 14:38
  • 1160

各种排序算法(冒泡、选择、快排、插入、希尔、堆排、归并、计数、基数)

各种排序算法
  • wanglelelihuanhuan
  • wanglelelihuanhuan
  • 2016年05月07日 22:42
  • 3055

快排原理

举例 :用快速排序将 6 1 2 7 9 3 4 5 10 8这个序列排序。 思路:       首先在这个序列中选择一个基准数(一个用来参照的数).,一般情况下选择左边第一个数作为基准数,接下来...
  • z1192277815
  • z1192277815
  • 2017年03月09日 20:27
  • 481

Java实现常见的排序算法之快排(快速排序)

快速排序算法是也,笔试面试中常被拿来做为问题,要求写出其实现过程和思想...
  • u011437847
  • u011437847
  • 2016年05月12日 11:03
  • 5533

快排代码示例

快排是排序中的经典算法,最坏情况下复杂度是O(n^2),期望的时间复杂度是O(nlgn)。主要思想是:每次给一个元素x=A[r]找到其特定的位置,使左边的元素都小于x,右侧的值都大于x。如何实现就是用...
  • x_shuck
  • x_shuck
  • 2016年05月19日 14:51
  • 1038

C语言实现基2DIF-FFT算法(桑德·图基快速傅立叶变换)

傅立叶变换能将时域信号转换为由sin函数为基底的频域信号,从而我们可以从信号中提取出频率信息或截断频谱简化信号压缩信息。计算机难以处理连续信号。DFT是一种适用于计算机处理的有限信号时频转换方法。DF...
  • sinat_25549771
  • sinat_25549771
  • 2016年11月24日 14:54
  • 1372

快速排序原理及java实现

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排...
  • crazy_rain
  • crazy_rain
  • 2007年04月20日 10:44
  • 8957
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基2快排原理与代码
举报原因:
原因补充:

(最多只允许输入30个字)