最小的k個數1 堆排序實現
// 使用堆排序實現 其時間復雜度為O(nlgn)
private static void buildMaxHeap(int[] input, int end)
{
// 從非葉子節點開始進行
for (int i = (end - 1) / 2; i >= 0; i--)
{
// 當前節點 cur的字節點位cur*2+1&cur*2+2
int cur = i;
// cur的右孩子存在
while (cur * 2 + 1 < end)
{
int bigIndex = cur * 2 + 1;
int rightOfCur = cur * 2 + 2;
// 找出孩子節點中的最大值索引
if (input[bigIndex] < input[rightOfCur])
{
bigIndex++;
}
// input[cur]節點與input[bigIndex] 進行比較進
if (input[cur] < input[bigIndex])
{
int temp = input[cur];
input[cur] = input[bigIndex];
input[bigIndex] = temp;
// 尤其重要
cur = bigIndex;
}
else
{
break;
}
}
}
}
private static int[] minKOfNums(int[] nums, int k)
{
// 特殊值考慮
if (nums == null || nums.length < k || k <= 0)
{
return null;
}
// 聲明堆
int[] maxHeap = new int[k];
// 初始化
for (int i = 0; i < k; i++)
{
maxHeap[i] = nums[i];
}
// 建成最大堆
buildMaxHeap(maxHeap, maxHeap.length - 1);
// 進行後續的比較
for (int i = k; i < nums.length; i++)
{
if (maxHeap[0] > nums[i])
{
maxHeap[0] = nums[i];
// 重新建maxHeap
buildMaxHeap(maxHeap, maxHeap.length - 1);
}
}
return maxHeap;
}
最小的k個數1 堆排序實現