日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++求区间第k大数_数组中求第K大数的实现方法

發布時間:2023/12/19 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++求区间第k大数_数组中求第K大数的实现方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題:有一個大小為n的數組A[0,1,2,…,n-1],求其中第k大的數。

該問題是一個經典的問題,在《算法導論》中被作為單獨的一節提出,而且其解決方法很好的利用了分治的思想,將時間復雜度控制在了O(n),這多少出乎我們的意料,此處暫且不表。

該問題還可以變形為:有一個大小為 n的數組A[0,1,2,…,n-1],求其中前k大的數。

一字之差,原問題是“第k大”,變形的問題是“前k大”,但是平均時間復雜度卻都可以控制在O(n),這不由得讓人暗暗稱奇。

我們先分析原問題:有一個大小為 n的數組A[0,1,2,…,n-1],求其中第k大的數。

我們先取特例,令k=1,那么就是取最大的數,只要掃描一遍數組就可以確定該值,如果k=2,則掃描兩邊數組就可以確定第二大的數,依此類推下去,時間復雜度是O(k*n),如果k跟n是一個數量級,那么時間復雜度就是O(n*n)了,顯然不是最優的解法。

考慮分治法,難點在于如何將該問題分解為兩個子問題。

快速排序最基礎的一步:

隨機取某一個數x,將其與數組末尾元素交換,然后將比其小的數交換至前,比其大的數交換至后。

這一步使某一數組的快速排序問題分解成兩個子數組的排序問題,現在我們就依此來解決取第k大的數這個問題。

設數組下表從0開始,至n-1結束。

1、 隨機取某個數,將其與數組末尾元素交換。

a)??????? idx=rand(0,n-1);生成[0,n-1]間的隨機數。

b)??????? Swap(array[idx], array[n-1]);

2、 用末尾元素x,將比x小的數交換至前,比x大的數交換至后,并返回此時x在數組中的位置mid。

3、 如果mid==n-k,那么返回該值,這就是第k大的數。

如果mid>n-k,那么第k大的數在左半數組,且在左半數組中是第k-(n-mid)大的數。

如果mid

復制代碼 代碼如下:

#include "iostream"

using namespace std;

int random_partion(int *p, int n)

{

int idx=rand()%n;

swap(p[idx], p[n-1]);

int i=-1;??? //i表示最后一個小于p[n-1]的元素的位置

int j=0;???? //j用來掃描數組

for(j=0; j

{

//將小于p[n-1]的數交換到前半部分

if(p[j]

{

swap(p[++i], p[j]);

}

}

swap(p[++i], p[n-1]);

return i;

}

int getMaxK(int *p, int n, int k)

{

int mid;

if(k<=0)

return -1;

if(n

return -1;

mid=random_partion(p, n);?? //對原數組進行一次劃分

if(mid == n-k)????? //如果mid==n-k,那么返回該值,這就是第k大的數

return p[mid];

else if(mid

return getMaxK(p+mid+1, n-mid-1, k);? //如果mid

else

return getMaxK(p, mid, k-(n-mid));?? //如果mid>n-k,那么第k大的數在左半數組,且在左半數組中是第k-(n-mid)大的數

}

int main(void)

{

int num,a[] = {12012, 3, 945, 965, 66, 232, 65, 7, 8, 898, 56, 878, 170, 13, 5};

num=getMaxK(a, 15, 4);

printf("%d\n",num);

system("pause");

return 0;

}

總結

以上是生活随笔為你收集整理的c++求区间第k大数_数组中求第K大数的实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。