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

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

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

服務器之家 - 編程語言 - C/C++ - 深入線性時間復雜度求數組中第K大數的方法詳解

深入線性時間復雜度求數組中第K大數的方法詳解

2020-12-06 15:41C語言教程網 C/C++

本篇文章是對線性時間復雜度求數組中第K大數的方法進行了詳細的分析介紹,需要的朋友參考下

求數組中第K大的數可以基于快排序思想,步驟如下:
1、隨機選擇一個支點
2、將比支點大的數,放到數組左邊;將比支點小的數放到數組右邊;將支點放到中間(屬于左部分)
3、設左部分的長度為L,

當K < L時,遞歸地在左部分找第K大的數
當K > L時,遞歸地在有部分中找第(K - L)大的數
當K = L時,返回左右兩部分的分割點(即原來的支點),就是要求的第K大的數
以上思想的代碼實現如下:

復制代碼 代碼如下:


/**
線性時間復雜度求數組中第K大數
** author :liuzhiwei
** data   :2011-08-07 
**/
#include "iostream"
using namespace std;
//基于快速排序思想,求數組a中第k大的數,low和high分別為數組的起始和結束位置
//時間復雜度為o(n),n為數組的長度
//1<=k<=n
//如果存在,返回第k大數的下標,否則返回-1
int selectk(int a[], int low, int high, int k)
{
 if(k <= 0)
  return -1;
 if(k > high - low + 1)
  return -1;
 int pivot = low + rand()%(high - low + 1);    //隨即選擇一個支點
 swap(a[low], a[pivot]);
 int m = low;
 int count = 1;
 //一趟遍歷,把較大的數放到數組的左邊
 for(int i = low + 1; i <= high; ++i)
 {
  if(a[i] > a[low])
  {
   swap(a[++m], a[i]);
   count++;              //比支點大的數的個數為count-1
  }
 }
 swap(a[m], a[low]);           //將支點放在左、右兩部分的分界處
 if(count > k)
 {
  return selectk(a, low, m - 1, k);
 }
 else if( count < k)
 {
  return selectk(a, m + 1, high, k - count);
 }
 else
 {
  return m;
 }
}
int main(void)
{
 int a[] = {5, 15, 5, 7, 9, 17,100, 3, 12, 10, 19, 18, 16, 10, 1000,1,1,1,1,1,1,1,1};
 int r = selectk(a, 0, sizeof(a) /sizeof(int) - 1, 5);
 cout<<(r == -1 ? r : a[r])<<endl;
 system("pause");
 return 0;
}


稍微改動一下,就可以修改為求數組中第K小數
完整的代碼如下:

復制代碼 代碼如下:


/**
線性時間復雜度求數組中第K小數
** author :liuzhiwei
** data   :2011-08-07 
**/
#include "iostream"
using namespace std;
//基于快速排序思想,求數組a中第k小的數,low和high分別為數組的起始和結束位置
//時間復雜度為o(n),n為數組的長度
//1<=k<=n
//如果存在,返回第k小數的下標,否則返回-1
int selectk(int a[], int low, int high, int k)
{
 if(k <= 0)
  return -1;
 if(k > high - low + 1)
  return -1;
 int pivot = low + rand()%(high - low + 1);    //隨即選擇一個支點
 swap(a[low], a[pivot]);
 int m = low;
 int count = 1;
 //一趟遍歷,把較小的數放到數組的左邊
 for(int i = low + 1; i <= high; ++i)
 {
  if(a[i]<a[low])
  {
   swap(a[++m], a[i]);
   count++;              //比支點小的數的個數為count-1
  }
 }
 swap(a[m], a[low]);           //將支點放在左、右兩部分的分界處
 if(k < count)
 {
  return selectk(a, low, m - 1, k);
 }
 else if( k > count)
 {
  return selectk(a, m + 1, high, k - count);
 }
 else
 {
  return m;
 }
}
int main(void)
{
 int a[] = {5, 15, 5, 7, 9, 17,100, 3, 12, 10, 19, 18, 16, 10, 1000,1,1,1,1,1,1,1,1};
 int r = selectk(a, 0, sizeof(a) /sizeof(int) - 1, 23);
 cout<<(r == -1 ? r : a[r])<<endl;
 system("pause");
 return 0;
}

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

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

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

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

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

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

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

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

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

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

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

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

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

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

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

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

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

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

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

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

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

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

    xiaocaidayong8482021-08-20
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
主站蜘蛛池模板: 成人av在线播放 | 日韩1区| 国产亚洲精品美女久久久久久久久久 | 国产成人av在线 | 亚洲性视屏 | 亚洲文字幕 | 精品国产成人 | 国产男女做爰免费网站 | 九九热在线视频观看这里只有精品 | 久久久99精品免费观看 | 欧美成人免费 | 色婷婷网 | 国产片免费看 | 淫片在线观看 | 欧美一级黄| 国产精品久久久av | 黄色一级毛片在线观看 | 久久久999精品视频 亚洲国产网站 | 日本三级视频在线观看 | 久操色 | 亚洲免费在线 | 一区二区福利 | 国产亚洲精品久久久 | 亚洲福利 | 成人在线小视频 | 日韩成人在线一区 | 黄色一级毛片 | 综合在线视频 | 九九综合久久 | 综合久久久 | 久久中文字幕一区二区三区 | 精品欧美 | 国产精品成av人在线视午夜片 | 精品国产91乱码一区二区三区 | 在线播放一区二区三区 | 91亚洲日本aⅴ精品一区二区 | www久 | 国产视频综合在线 | 国产亚洲精品久久久久动 | 精品视频一区二区三区 | 久久亚洲一区 |