為同寢的傢伙寫了乙個求乙個無序陣列中第k小數的程式。思想就是快排的思想。找乙個點,然後放到末尾,然後將小於這個數的值放在陣列前面,大於這個值的放在陣列後面,然後在將這個末尾的數放回。這個末尾數放入的位置i代表已經找到第i小的數。下面你應該明白了吧,放入的位置如果是k,恭喜你找到了第k小的數。
同樣找到第k大的數類似的解法,找到前k個最大數也一樣。找乙個陣列的中位數也一樣做。求n個陣列的中位數也一樣的做。求n個陣列的前k個大數或小數也類似可以做。
這個程式的演算法複雜度是o(n)
//swaptwonumber
void swap( int &i, int &j)
//findapositiontopartitionthearray
int partition( int start, int end)
//quicksort
int quicksort( int a, int start, int end)
if (start==end)
int p=partition(start,end);
int i=0;
swap(a[p],a[end]);
int j=end-1;
while (j>=i)
while (j>=0&&a[j]>a[end])
swap(a[i],a[j]);
} swap(a[i],a[j]);
swap(a[i],a[end]);
return i;
} //findthek-thsmallernumber
int findk( int a, int num, int kth)
int k=kth-1; //becausethearrayindexstartswith0,not1;
int position=-1;
int start=0;
int end=num-1;
while (position!=k)
else }
return a[position];
} public class sort return start; } public void findtopk(sorttag al,int k) int mid = 0; int low = 0; int high = al.length-1; while(low <= high) else if(mid > k) else } } } class sorttag public int compare(object o) }
注意這k個數可是無序的..如果想有序..再排序一下就可以了.
無序陣列中找第K個的數
題目分析 也就是從小往大排,第k小那個數。方法1 排序 nlogn 方法2 利用堆 nlogk 首先將前k個元素構建最大堆,堆頂是前k個元素中第k小的元素。這步複雜度klogk 遍歷剩餘元素 這步複雜度 n k logk 如果新元素 堆頂 堆頂不可能是第k大元素 移除堆頂 將新元素插入堆 否則 新元...
演算法導論 快速找出無序陣列中第k小的數
題目描述 給定乙個無序整數陣列,返回這個陣列中第k小的數。解析 最平常的思路是將陣列排序,最快的排序是快排,然後返回已排序陣列的第k個數,演算法時間複雜度為o nlogn 空間複雜度為o 1 使用快排的思想,但是每次只對patition之後的陣列的一半遞迴,這樣可以將時間複雜度將為o n 在 演算法...
無序數字中位數 如何在無序陣列中查詢第K小的值
如題 給定乙個無序陣列,如何查詢第k小的值。例子如下 在乙個無序陣列,查詢 k 3 小的數 輸入 arr 輸出 7在乙個無序陣列,查詢 k 4 小的數 輸入 arr 輸出 10幾種思路如下和複雜度分析如下 1 最簡單的思路直接使用快排,堆排或者歸併排,排序之後取陣列的k 1索引的值即可,時間複雜度為...