輸入n個整數,輸出其中最小的k個

來源:互聯網
上載者:User
/** * 題目:輸入n個整數,輸出其中最小的k個。 * 例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。 * 這道題最簡單的思路莫過於把輸入的n個整數排序,這樣排在最前面的k個數就是最小的k個數。只是這種思路的時間複雜度為O(nlogn)。 * 題目並沒有要求要尋找的k個數,甚至後n-k個數是有序的,既然如此,咱們又何必對所有的n個數都進行排序列?       這時,咱們想到了用選擇或插入排序,即遍曆n個數,先把最先遍曆到得k個數存入大小為k的數組之中,對這k個數,進行排序,找到k個數中的最大數kmax,  k1<k2,K3<…<kmax(kmax設為k個元素的數組中最大元素),用時O(k),後再繼續遍曆後n-k個數,x與kmax比較,如果x<kmax,則x代替kmax,並再次排序k個元素的數組。如果x>kmax,則不更新數組。       這樣,每次更新或不更新數組的所用的時間為O(k)或O(0),整趟下來,總的時間複雜度平均下來為:n*O(k)=O(n*k)。3、  當然,更好的辦法是維護k個元素的最大堆,原理與上述第3個方案一致,即用容量為k的最大堆儲存最小的k個數,此時,k1<k2<...<kmax(kmax設為大頂堆中最大元素)。遍曆一次數列,n,每次遍曆一個元素x,與堆頂元素比較,x<kmax,更新堆(用時logk),否則不更新堆。這樣下來,總費時O(n*logk)。此方法得益於在堆中,尋找等各項操作時間複雜度均為logk(不然,就如上述思路2所述:直接用數組也可以找出前k個小的元素,用時O(n*k))。 */public class MinK {/** *  * @param krr * @param k * @return */public static int[] minK(int krr[],int k){int arr[] = new int[k];for(int i = 0;i<k;i++)arr[i] = krr[i];buildHeap(arr);for(int j = k;j<krr.length;j++){if(krr[j]<arr[0]){arr[0] = krr[j];maxHeap(arr,1,k);}}return arr;}/** * 建最大堆 * @param arr */public static void buildHeap(int arr[]){int heapsize = arr.length;for(int i=arr.length/2;i>0;i--)maxHeap(arr,i,heapsize);}/** * 調整為最大堆 * @param arr * @param i * @param heapsize */public static void maxHeap(int arr[],int i,int heapsize){int largest = i;int left = 2*i;int right = 2*i+1;if(left<=heapsize&&arr[i-1]<arr[left-1])largest = left;if(right<=heapsize&&arr[largest-1]<arr[right-1])largest = right;if(largest!=i){int temp = arr[i-1];arr[i-1] = arr[largest-1];arr[largest-1] = temp;maxHeap(arr,largest,heapsize);}}public static void main(String[] args) {int krr[] = {1,3,4,2,7,8,9,10,14,16};int arr[] = minK(krr,4);for(int i =0;i<arr.length;i++)System.out.println(arr[i]);}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.