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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

寻找数组中最小的k个数(快排和堆排)

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 寻找数组中最小的k个数(快排和堆排) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述

輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

思路1:利用快排的思想,尋找第k個位置上正確的數,k位置前面的數即是比k位置小的數組,k后面的數即是比k位置元素大的數組

public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {ArrayList<Integer> res = new ArrayList<Integer>();if (input==null||input.length==0||input.length<k||k<=0) {return res;}int start = 0;int end = input.length-1;int index = partition(input, start, end);//一直循環知道找到第k個位置正確的數。while (index != k - 1) {if (index > k - 1) {end = index-1;index = partition(input, start, end);} else {start = index+1;index = partition(input, start, end);}}for (int i = 0; i < k; i++) {res.add(input[i]);}return res;}static int partition(int input[], int start, int end) {int tmp = input[start];while (start < end) {while (start < end && input[end] >= tmp) {end--;}input[start] = input[end];while (start < end && tmp >= input[start]) {start++;}input[end] = input[start];}input[start] = tmp;return start;}思路2:利用堆排序,特別適用于海量數據中尋找最大或者最小的k個數字。即構建一個大堆容器,初始化大小為k,變量初始數,如初始數組大小小于等于k直接返回,如果大于k,則選擇數組的前k個元素,填充堆,然后調整為最大堆。調整完之后,繼續從初始數組中拿出一個元素,如果該元素比大堆的堆頂小,則替換堆頂,繼續調整為最大堆,如果大于等于堆頂則直接丟棄,不作調整。
PS:大堆還是小堆的選擇很重要,不是尋找最小的k個元素就要選擇小堆,而且恰恰相反。尋找最小的k個數,其實就是尋找第k個大的元素,即尋找k個數中最大的,不斷調整堆,堆得元素個數是k,堆頂是最大值,遍歷完初始數組后,堆中存在的元素即使我們所要尋找的k個最小元素。

//堆排序:構建堆,不斷調整的過程,從最后一個不是葉子節點的節點開始。static public ArrayList<Integer> GetLeastNumbers_Solution1(int[] input, int k) {ArrayList<Integer> res = new ArrayList<Integer>();if (input==null||input.length==0||input.length<k) {return res;}int []maxHeap = new int[k];//初始化堆for (int i = 0; i < maxHeap.length; i++) {maxHeap[i] = input[i];}//將初始化的堆調整為最大堆for (int i = (maxHeap.length-1)/2; i >=0 ; i--) {adjustHeap(maxHeap, i);}//遍歷初始數組不斷調整最大堆for (int i = k; i <input.length ; i++) {if (maxHeap[0]>input[i]) {maxHeap[0] = input[i];adjustHeap(maxHeap, 0);}}for (int i = 0; i < maxHeap.length; i++) {res.add(maxHeap[i]);}return res;}static void adjustHeap(int maxHeap[],int i){int index = i;int lchild=2*i+1; //i的左孩子節點序號 int rchild=2*i+2; //i的右孩子節點序號 if(index<=(maxHeap.length-1)/2) {//尋找子節點中最大的節點if (lchild<maxHeap.length&&maxHeap[index]<maxHeap[lchild]) {index = lchild;}if (rchild<maxHeap.length&&maxHeap[index]<maxHeap[rchild]) {index = rchild;}if (i!=index) {//將節點與最大的子節點交換int tmp = maxHeap[index];maxHeap[index] = maxHeap[i];maxHeap[i] = tmp;//交換后,子樹可能不滿足最大推,遞歸調整。adjustHeap(maxHeap, index);}}


總結

以上是生活随笔為你收集整理的寻找数组中最小的k个数(快排和堆排)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: いいなり北条麻妃av101 | 老外一级片 | 欧美大片视频在线观看 | 狠狠干干干 | 久操视频免费看 | 青娱乐在线免费观看 | 成人国产精品免费观看 | 新91av| 水果视频污 | 99精品视频在线免费观看 | 中文字幕视频一区 | 在线观看亚洲免费视频 | 亚洲一区二区三区高清视频 | 国产熟妇搡bbbb搡bbbb搡 | 九一在线观看免费高清视频 | 日韩卡一卡二 | 日韩高清一级 | 免费看av毛片| 日日爱夜夜操 | 亚洲第一页综合 | www.xxxxx日本| 少女逼逼| 一区二区视频在线免费观看 | 久久新网址| 亚洲av永久无码精品三区在线 | 亚洲精品国产精品乱码桃花 | 婷婷伊人五月 | 免费国偷自产拍精品视频 | 黄色三级视频网站 | 成人精品视频99在线观看免费 | 久久日本精品字幕区二区 | 日韩八区| 在线免费国产视频 | 林雅儿欧洲留学恋爱日记在线 | 久久91亚洲人成电影网站 | 婷婷狠狠干| 国产91熟女高潮一区二区 | www.香蕉视频在线观看 | 欧美一区二区三区不卡视频 | 精品国产亚洲一区二区麻豆 | 打屁股疼的撕心裂肺的视频 | 综合视频在线观看 | 国产精品8| 婷婷激情小说 | 中文字幕亚洲图片 | 涩涩视频网 | 久色电影 | 少妇福利视频 | 欧美精品高清 | 伊人成人久久 | 欧美美女视频 | 亚洲第一综合色 | 久久久久久久久久影视 | www.日韩视频| 亚洲偷自 | 成年人午夜 | 中文字幕综合网 | 中文字幕一区二区三区人妻四季 | 无码精品一区二区三区在线播放 | 婷婷亚洲激情 | 精品国产乱码一区二区三 | 911精品国产一区二区在线 | 国产www免费观看 | 日韩欧美亚洲一区二区 | 激情婷婷在线 | 色爽爽一区二区三区 | 亚洲一区二三区 | 亚洲经典一区二区 | 亚洲毛毛片| 国产精品xxx视频 | 蜜桃视频在线观看一区二区 | av资源天堂 | 久久理伦| a在线天堂 | 健身教练巨大粗爽gay视频 | 久久作爱视频 | 日韩精品片 | 动漫av一区 | 日皮在线观看 | 亚洲成人aa | 欧美 另类 交 | 国产精品高清在线观看 | 尹人久久| 国产精品98 | 欧美乱欲视频 | 很污很黄的网站 | 午夜精品福利一区二区三区蜜桃 | 日本福利网站 | 亚洲一区二区三区加勒比 | www.黄色小说.com | 二男一女一级一片 | 99这里精品 | 色欧美在线 | 这里都是精品 | 久久久久久1 | 国产成人精品午夜福利Av免费 | 爱爱免费网址 | 国产精品主播在线 | 91黄色短视频 |