摘要:
这个题貌似完全颠覆一般的Logic:交换两个整数需要一个额外的空间用于保存:t = b;b = a;a= t;粗看上去似乎没有办法,但是仔细想一下,既然不能用额外的空间,那么能用的方法就只有数学方法,也许有效,那么第一个想法就是用A+b看看,稍微想一下就可以得到下面这个解法:a = a + b;b = a - b;a = a - b;这种方法会有问题,a+b有可能溢出,但异或就不会有溢出问题。还有更绝的(由DxZ网友提供):a = a ^ b;b = a ^ b;a = a ^ b;异或就是求同存异的过程,第一步得到a和b的不同,得到需要改变的位。 阅读全文
摘要:
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵。不过实际上,在数字范围有限制的情况下,是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个空间是常量,和n无关,所以是O(1) ),初值全部为0。那么假设有下面这些数字:10020030011906...那么对于每个这个数字,都做在count中记录一下:100 => count[100]++20 阅读全文
摘要:
当需要在无需列表中寻找第k小的元素时,一个显然的方法是将所有数据进行排序,然后检索k个元素。这种方法的运行时间为O(n log(n))。无序列表调用分区函数将自身分解成两个子表,其长度为i和n-i。第一个列表中的第一个i元素(不一定排序),当i与k进行比较时需在第一或第二个子列表中搜索元素。使用findMinK(ArrayListarray, int k, int i, int r)实现,同时使用下面testframe代码测试。在函数中可增加全局变量cmpcnt,在列表中利用分区函数交换元素时计数。对findMinK函数的实现,利用了快排的思想:先从n个元素中找一个任意分界点,设为m,假设m在 阅读全文