基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中选择,冒泡,快排原理代码 阶层 数组的排序 数组的排序 以及代码大全

一、方法的重载      概念:在同一个类中,方法名相同,参数列表不同,与返回值无关      优点:设计重载的目的是减少方法名的个数,便于程序员掌握,            程序在运行的过程中通过传...
  • KY1996
  • KY1996
  • 2017年07月17日 18:53
  • 114

VB快排代码

  • 2015年03月24日 23:37
  • 4KB
  • 下载

快排代码for C

  • 2013年04月06日 12:11
  • 271B
  • 下载

快排原理

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

快排代码 《数据结构》

#include /* C: * 参照《数据结构》(C语言版) * 调用:quicksort-->qsort-->partitions * 原理,通过一趟扫描将要排序的数据分割成独立的两部分...

关于数组TOP K算法(快排及最小堆方式C代码)

TOP K即返回给定集合最大的K个元素,这个集合有可能很大,十亿,有可能万亿,所以对算法的要求比较高。以下是我的总结: 一、采用快速排序的分治算法思想进行求解: 快速排序的思想是使用一个标志点将数...

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

归并排序求逆序数归并排序是建立在归并操作上的一种有效的排序算法。 树状数组用于数据的维护更新,快速排序时间复杂度较低,被一些公司面试经常要问。深度优先搜索,动态规划入门01背包...
  • Divide_
  • Divide_
  • 2016年05月21日 22:46
  • 4067

haskell实现快排的代码为什么这么短

haskell快排的代码为什么这么短 q_sort n=case n of []->[] (x:xs)->q_sort [a|a
  • gohike
  • gohike
  • 2016年10月01日 23:52
  • 973

快排代码示例

快排是排序中的经典算法,最坏情况下复杂度是O(n^2),期望的时间复杂度是O(nlgn)。主要思想是:每次给一个元素x=A[r]找到其特定的位置,使左边的元素都小于x,右侧的值都大于x。如何实现就是用...
  • x_shuck
  • x_shuck
  • 2016年05月19日 14:51
  • 842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基2快排原理与代码
举报原因:
原因补充:

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