一个快速排序的小技巧

最近在设计的代码中有这么一个要求,有一堆字符串,如:

A[1], A[3], A[5], A[2]

(假设前缀都是A,并且中括号中的数值没有重复),现在要用程序将可以合并的数组都合并起来,变成:

A[1..3], A[5]

那么我想到的办法是这样的,将中括号中的数字提取出来,放在一个List中,然后对List排序,也就是说上述数据排完序后变成:

1,2,3,5

那么这时候再从头至尾遍历一下数组就可以知道哪些数值是连续的了。

设计完后,coding工作交给了其他同事,为了快速实现代码功能,他当时使用了冒泡排序,后来工作以忙,就再也没有去改那些代码,直到最近,用户对该模块的性能提出了质疑(相比过去的版本,慢了很多),我们才回头重新审视这段代码,我自认为设计没有什么问题,只需要将冒泡排序改为快速排序就可以大幅度提高速度,正打算这么做呢,PM前来了解了一下我们的工作,接着给出了一个及其简单而快速的排序方法:

由于我们要排序的数值都是唯一的,并且都是简单的数字,所以以空间还速度的方法:先建立一个足够大的数组,将其清零,当从list中每读到一个数值时,将将数组的该位设为1,那么按照上面的数据,最终我们的数组就变为:

-----------------------------------

|  1  |  1  |  1  |  0  |  1  |  ......

-----------------------------------

这时候,再遍历一下数组,判断0和1的状态,就可以方便的知道哪些数值是连续的了。

另外,在事先从A[1]这样的字符串中提取出数值时,我们已经可以预先知道所有字符的数值,那么确定了最小和最大值后,可以只分配这段刚好够用的内存,而不需要开非常大的内存了。

其次,由于只需要用0,1两种状态表示数组的某以位是否被占据,那么完全可以使用单个bit来表示状态,那么一个Byte,就可以用来表示前8个数值是否被占据了,这样又将内存节省到原来的1/8。

用了以上算法后,不再需要任何排序工作了,使用Quantify测试发现,该过程在整个模块的执行过程中的时间,由原来的30%变为2%了,非常了不起的算法呢。(有时候真是代码越简单越有效啊,可惜我却没有想到,姜还是老的辣啊)。

图克斯软件:

http://www.tonixsoft.com

你可能感兴趣的:(算法,工作,list,测试,byte)