TopK問題 求陣列中第K小的數

2021-08-05 19:22:57 字數 2147 閱讀 8278

public class problem_01_findminknums 

int kheap = new int[k];

for (int i = 0; i != k; i++)

for (int i = k; i != arr.length; i++)

} return kheap;

} public static void heapinsert(int arr, int value, int index) else

} }public static void heapify(int arr, int index, int heapsize)

if (right < heapsize && arr[right] > arr[largest])

if (largest != index) else

index = largest;

left = index * 2 + 1;

right = index * 2 + 2;

} }// o(n)

public static int getminknumsbybfprt(int arr, int k)

int minkth = getminkthbybfprt(arr, k);

int res = new int[k];

int index = 0;

for (int i = 0; i != arr.length; i++)

} for (; index != res.length; index++)

return res;

} public static int getminkthbybfprt(int arr, int k)

public static int copyarray(int arr)

return res;

} public static int select(int arr, int begin, int end, int i)

int pivot = medianofmedians(arr, begin, end); //找中位數組的中位數

int pivotrange = partition(arr, begin, end, pivot); //為什麼返回陣列,因為要找等於的範圍,因此有兩個下標

if (i >= pivotrange[0] && i <= pivotrange[1]) else if (i < pivotrange[0]) else

} public static int medianofmedians(int arr, int begin, int end)

return select(marr, 0, marr.length - 1, marr.length / 2); //返回中位數組中的中位數

} public static int partition(int arr, int begin, int end, int pivotvalue) else if (arr[cur] > pivotvalue) else

} int range = new int[2];

range[0] = small + 1;

range[1] = big - 1;

return range;

} public static int getmedian(int arr, int begin, int end)

//5個數進行排序,選了乙個常數項低的插入排序

public static void insertionsort(int arr, int begin, int end) else

}} }

public static void swap(int arr, int index1, int index2)

public static void printarray(int arr)

system.out.println();

} public static void main(string args) ;

// sorted :

printarray(getminknumsbyheap(arr, 10));

printarray(getminknumsbybfprt(arr, 10));

}}

求陣列中第K大的數

本題的的陣列是可以包含重複元素的,且要求時間複雜度控制在o n 解題思路 陣列中第k大的數等價於排序陣列中第n k個數,直觀的想法是將陣列排序後取第n k個數即可,但是最快的排序演算法時間複雜度也是o nlogn 可以參考快速排序一次劃分的思想,將時間複雜度降低為o n 一次劃分可以講陣列分為三部分...

求陣列中第k大的數

文章裝載自 使用快排,第一趟快排過後,右邊的元素都比樞軸大,左邊的都比樞軸小。當我們要求第k大的數,只需要左邊的元素個數是len k,len是陣列總長度。第一次快排下來,設樞軸位置是mid,如果mid k,說明第k大元素應該在左邊序列中,遞迴左邊序列。當 mid k 時,說明k元素在右邊序列,遞迴右...

求陣列第K大的數

問題 有乙個大小為n的陣列a 0,1,2,n 1 求其中第k大的數。我們先分析原問題 有乙個大小為 n的陣列a 0,1,2,n 1 求其中第k大的數。我們先取特例,令k 1,那麼就是取最大的數,只要掃瞄一遍陣列就可以確定該值,如果k 2,則掃瞄兩邊陣列就可以確定第二大的數,依此類推下去,時間複雜度是...