程式設計練習 求無序陣列第k小的數

2021-08-22 19:57:07 字數 1298 閱讀 7714

為同寢的傢伙寫了乙個求乙個無序陣列中第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索引的值即可,時間複雜度為...