如何在百萬級數據中找到第K大的數據

假設數組爲arr,求第k大元素數組

思想:利用快排思想,對數組先進行一趟快排,將數組進行分區arr[0...p-1],arr[p],arr[p+1,arr.length-1](p是索引元素的下標),緊接着判斷p+1與k的關係,若是p+1=k,那麼arr[p]就是第k大元素,若是p+1<k,則對arr[p+1,arr.length-1]進行上述操做,反之對arr[0,p-1]進行上述操做ui

時間複雜度分析:spa

* 第一次分區查找,咱們須要對大小爲 n 的數組執行分區操做,需須要遍歷 n 個元素。第二次分區查 * 找,咱們只須要對大小爲 n/2 的數組執行分區操做,須要遍歷n/2 個元素。依次類推,分區遍歷 * 元素的個數分別爲n、n/2、n/4、n/8、n/16.……直到區間縮小爲 1* * 若是咱們把每次分區遍歷的元素個數加起來,就是:n+n/2+n/4+n/8+…+1。這是一個等比數列求和,最後的和等於 2n-1* 因此,上述解決思路的時間複雜度就爲 O(n) * * 利用快排分區的思路:數組按降序排序的方式獲取每次provt[i]的座標來進行判斷

實現代碼以下:code

public class ApplicationQuickSort { public static void main(String[] args) { int[] arr = {2,5,8,6,4,1,2,4,1,4,10,1,5,4,1,4,5,1,-2,5,2,4,5,5,2,100,4}; int t = Partition(arr,0,arr.length-1); System.out.println(t); int k = 1; while(t+1!=k){ if(t+1<k){ t = Partition(arr,t+1,arr.length-1); }else if(t+1>k){ t = Partition(arr,0,t-1); } } System.out.println(arr[t]); } public static int Partition(int[] arr,int start,int end){ if(start<end){ int tmp = arr[start]; while(start<end){ int t = 0; while(tmp >= arr[end]&&start<end){ end--; } if(start<end){ arr[start] = arr[end]; start++; } while(arr[start] >= tmp&&start<end){ start++; } if(start<end){ arr[end] = arr[start]; end--; } } arr[start] = tmp; return start; } return -1; } }
相關文章
相關標籤/搜索