尋找陣列中最小的k個數(快排和堆排)

2021-08-19 04:52:04 字數 1364 閱讀 5219

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

public arraylistgetleastnumbers_solution(int  input, int k) 

int start = 0;

int end = input.length-1;

intindex = partition(input, start, end);

//一直迴圈知道找到第k個位置正確的數。

while (index != k - 1) else

}for (int i = 0; i < k; i++)

return res;

}static

int partition(int input, int start, int end)

input[start] = input[end];

while (start < end && tmp >= input[start])

input[end] = input[start];

}input[start] = tmp;

return start;

}

//堆排序:構建堆,不斷調整的過程,從最後乙個不是葉子節點的節點開始。

static

public arraylistgetleastnumbers_solution1(int input, int k)

int maxheap = new

int[k];

//初始化堆

for (int i = 0; i < maxheap.length; i++)

//將初始化的堆調整為最大堆

for (int i = (maxheap.length-1)/2; i >=0 ; i--)

//遍歷初始陣列不斷調整最大堆

for (int i = k; i if (maxheap[0]>input[i])

}for (int i = 0; i < maxheap.length; i++)

return res;

}static

void adjustheap(int maxheap,int i)

if (rchildindex]index = rchild;

}if (i!=index)

}

優缺點:

思路1優點:節省空降,時間複雜度平均為o(n)

缺點:需要修改原始陣列

思路2優點:不用修改原始陣列,適合海量資料

缺點:時間複雜度略高o(nlogk)

查詢陣列中最小k個數

思路 可採用大頂堆來實現 維護乙個規模為k的大頂堆。從前往後掃瞄陣列元素 若大頂堆的size小於k,則把當前元素插入大頂堆中 若小於k,若當前元素小於堆頂元素,則刪除堆頂元素,插入當前元素。考慮到從頭實現乙個大頂堆比較麻煩,這裡使用treeset容器,它提供有序的set。treeset底層實際使用的...

找出陣列中最小的k個數

leetcode 面試題40.最小的k個數 快速排序,時間複雜度為nlogn,然後前k個元素就是最小的k個數 class solution 原理也是快速排序的原理,只不過增加了停止條件。不用完全排序而已。class solution int label quicksort arr,0,arr.len...

劍指 Offer 40 最小的k個數 快排 堆

劍指 offer 40.最小的k個數 輸入整數陣列 arr 找出其中最小的 k 個數。例如,輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1 2 3 4。示例 1 輸入 arr 3,2,1 k 2 輸出 1,2 或者 2,1 示例 2 輸入 arr 0,1,2,1 k 1 輸出 0...