快排,注意比较的方法,因为 bitCount 相同时也要排序。
class Solution {
public int[] sortByBits(int[] arr) {
if (arr == null || arr.length == 0) {
return new int[0];
}
quickSort(arr, 0, arr.length-1);
return arr;
}
private void quickSort(int[] arr, int l, int r) {
if (l < r) {
int mid = partition(arr, l, r);
quickSort(arr, l, mid-1);
quickSort(arr, mid+1, r);
}
}
private int partition(int[] arr, int l, int r) {
int key = arr[r];
int i = l - 1;
for (int j=l; j<r; j++) {
if (smaller(arr[j], key)) {
i++;
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
i++;
int tmp = arr[i];
arr[i] = arr[r];
arr[r] = tmp;
return i;
}
private boolean smaller(int i, int j) {
int iCount = Integer.bitCount(i);
int jCount = Integer.bitCount(j);
if (iCount < jCount) {
return true;
}
if (iCount == jCount) {
return i < j;
}
return false;
}
}
使用我自己写的 bitCount方法,是 10ms,使用 Integer.bitCount方法是 3ms。
private int bitCount(int i) {
int result = 0;
while (i != 0) {
if ((i & 1) == 1) {
result++;
}
i >>>= 1;
}
return result;
}
Integer.bitCount
public static int bitCount(int i) {
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
本文深入探讨了快速排序算法的实现,特别是在处理位运算时的优化技巧。通过自定义和标准库提供的位计数方法对比,展示了如何有效提升排序效率。文章提供了详细的代码示例,包括快速排序的分区函数和比较逻辑,以及两种位计数方法的性能对比。
522

被折叠的 条评论
为什么被折叠?



