国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 數組中求第K大數的實現方法

數組中求第K大數的實現方法

2020-12-07 11:33C語言教程網 C/C++

本篇文章是對數組中求第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<n-k,那么第k大的數在右半數組,而且仍然是第k的數。

復制代碼 代碼如下:


#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<n; j++)
     {
            //將小于p[n-1]的數交換到前半部分
            if(p[j]<p[n-1])
            {
    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<k)
            return -1;
  mid=random_partion(p, n);   //對原數組進行一次劃分
     if(mid == n-k)      //如果mid==n-k,那么返回該值,這就是第k大的數
   return p[mid];
     else if(mid<n-k)
   return getMaxK(p+mid+1, n-mid-1, k);  //如果mid<n-k,那么第k大的數在右半數組,而且仍然是第k大數
     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/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产亚洲欧美另类一区二区三区 | 日韩高清一区 | 亚洲成人在线播放视频 | 欧美精品亚洲精品 | 色视频在线 | 性欧美大战久久久久久久免费观看 | 日日操日日操 | 免费看国产黄色 | 国产精品一二三在线观看 | 日韩理论在线 | 在线91| 欧美午夜精品 | 国产精品久久久久久久久免费高清 | 色在线影院 | 欧美日韩一级视频 | 欧美一区免费 | 亚洲深深色噜噜狠狠网站 | 欧美日韩a | 99精品热视频 | 99草在线视频 | 欧美精品第一页 | 免费黄色大片 | 中文字幕影视 | 国产成人免费 | 久久99精品一区二区三区三区 | 免费一级片在线观看 | 久久人体视频 | 欧美激情久久久 | 日韩在线色 | 宅男lu666噜噜噜在线观看 | 国产主播福利 | 欧美性猛交一区二区三区精品 | 看黄色片网站 | 亚洲国产精品va在线看黑人 | 亚洲天堂免费在线 | 国产特级毛片aaaaaaa高清 | 日韩精品一区二区三区四区五区 | 久久国产精品一区 | 婷婷激情综合 | 99成人| 99国产精品99久久久久久 |