julia语言列表 怎样只用位运算实现高效的排序算法?

[更新]
·
·
分类:生活百科
2188 阅读

julia语言列表

怎样只用位运算实现高效的排序算法?

怎样只用位运算实现高效的排序算法?

前言如果你准备看这篇文章,我就当你是懂快速排序算法原理的。下面是我在2018年10月3日想到的基于二进制位运算对正整数进行的一种快速排序算法,目前的代码只能对正整数进行有效的排序,当然,稍微修改一下就可以支持负数的排序了。后面会给出我用Julia语言实现的没有经过优化的代码和一些测试结果。如果您对此能有什么改进或者能帮吗优化一下代码,请告知我一下,我会非常感谢您。下面是此算法的思想和原理。2是一个神奇的数字,可以用来做很多东西,二叉树,二分搜索,快速幂算法以及很多分治算法都是在2这个神奇的数字的帮助才能达到他们的优雅和高效率。利用二进制,我们也可以进行快速排序。如果要对一列数字进行排序,你会怎样去做呢?学过快速排序的同学应该会立即想到快速排序。先选一个数字,然后从两边开始,分别把小于它的数字交换到它的左边,把大于它的数字交换到它右边,完成这一过程,其右边的数字全体大于等于它,左边的数字全部小于等于它。然后分别对其左边和右边递归地运用此方法(快速排序)进行排序,当排序的长度小于2时,递归过程完成了,这一列数字也就变成有序的了。这种最基本的快排算法是不是也散发着二分的思想?如果它再二一点会怎样?那就是我下面想要谈论的基于二进制的快速排序算法了。哈哈,我给它加入了二进制。其实除开二进制的位运算,这个算法跟快速排序算法基本上是一样的,所以我暂且称之为BQuickSort(Binary or Bit)。算法的基本思想对每一个二进制位,把该位是1的数字划分到右边,是0的划分到左边。高位优先,通过交换来进行。实现在算法的实现上我采用了按位与运算,先用的时间复杂度求出其中最大的数字,然后对最大的数字进行一次简单的flp2运算(把其二进制最高位之外的bit全部置0,这里的最高位并非64或32等,而是左边第一个不为0的bit),获得一个为2的n次幂的整数变量,我们暂且把它命名为shift。每一次所做的就是用这个shift与一个要排序的区间段进行按位与运算运算,将右边运算结果为0的数字同左边运算结果不为0的数字进行交换,并返回交换之后的分割位置。然后递归地将同样的算法运用于分割位置的左边和右边,只需将shift右移一位即可。递归结束的条件是区间宽度小于1或者shift等于0。对于一次部分排序,我写了两个函数,一个像快速排序那样从两边向中间行进,是不稳定的算法,另一个只从左边行进,应该是稳定的算法。演示接下来我将演示对下列所示的整数序列进行的BQuickSort。 在这里最大的数字是10(二进制为1010),通过对10进行flp2运算,我们将获得一个数字8(二进制为1000)。将shift(这里为8)同每一个数字进行按位与运算并把运算结果不为0的数字交换到右边,最后我们返回一个整数索引10,它记录了一次排序之后的分割线(分割线左边的数字都小于8,同8进行按位与运算为0;右边的数字都大于等于8,同8进行按位与运算不为0)。 鉴于分割线及其右边的数字都大于左边的数字,下面值演示对左边的数字进行的排序,同样的方法适用于右边。将shift右移一位(结果为4),然后与分割线左边的数字(前9个)进行与上面一样的部分排序操作,我们将得到下面这张图所示的序列。 再对前3个数字进行shift为2的部分排序,1将被交换到左边,此时前3个数已经有序,但是递归其实尚未结束,下一次递归是shift为1的一次部分排序。继续对第4~9个数字执行同样的部分排序,最后我们将会得到前九个数字的有序排列。之后再对第10~12个数字进行同样的部分排序,我们就会得到一个所有数字的有序排列。 算法实现代码
[/code][size5]测试代码[/size][code]复制代码一些测试结果[code][/code]

有什么好看的电影吗?

如果你喜欢高以翔的话,建议看一下好莱坞电影《圣杯神器:骸骨之城(致命契约)》,高在里面饰演一名法力高强的男巫。这对高是一个很大的突破,以前总是在演高富帅,这次的形象实在太颠覆了,看到他出场的时候我居然没有认出来,我猜很多观众看到应该都会感到惊喜吧。
本人最近都在看关于高的影视剧作品,看了有《遇见王沥川》、《彩虹的重力》、,《如果我爱你》、《女人不坏》、《101次求婚》、《华丽一族》,《唐人街1871》、和这部《圣杯神器:骸骨之城(致命契约)》。当然还有其他的很多作品,暂时还没有开始看。
《骸骨之城》在豆瓣的评分是5.7分,并不是很高,但是个人很喜欢。里面的演员个个都是很有分量,演员们曾经参演的作品囊括了这些年来几乎所有的如雷贯耳的作品:《哈利波特》、《绯闻女孩》、《圣女贞德》、《金刚狼》、《权利的游戏》、《老友记》、《阿凡达》、《生化危机》、《霍比特人》、《都铎王朝》等,演技自然不用质疑,连酒吧角落里的无名演员满身都是戏。
高能够参演也就证明其综合实力在线。我看了几分钟之后,发现其实这部电影之前是看过的,但是之前看的时候并不知道高以翔这位演员,所以没有留意…… 发现自己真的是没眼力,白白得让这么一位宝藏演员从自己的视线里逃走。都怪自己眼瞎……