我需要找到一个高度优化的算法来对只包含0和1的数组进行排序。
我的解决方案是计算0的数量(假设为x)和1的数量(假设为y)。一旦您这样做了,就在数组中放置x个0,然后是y个1。这使其为O(n)。
是否有任何比这更好的运行算法???我在面试中被问到这个问题。
low = 0;
high = arr.length - 1;
while (low < high) {
while (arr[low] == 0) {
low ++;
}
while (arr[high] == 1) {
high --;
}
if (low < high) {
//swap arr[low], arr[high]
}
}
如果您对数组求和,您可以得到1的数量,这样稍微更有效一些,但仍然是O(n)。
#define MASK_01010101 (((unsigned int)(-1))/3)
#define MASK_00110011 (((unsigned int)(-1))/5)
#define MASK_00001111 (((unsigned int)(-1))/17)
int bitcount (unsigned int n) {
n = (n & MASK_01010101) + ((n >> 1) & MASK_01010101);
n = (n & MASK_00110011) + ((n >> 2) & MASK_00110011);
n = (n & MASK_00001111) + ((n >> 4) & MASK_00001111);
return n % 255 ;
}