小伙伴们大家好,今天为大家带来一道算法题:
分析题意我们可知:数组最小元素一定位于0~k位置,如果我们首先将0~k位置构成最小堆,那么堆顶一定就是数组最小值。将堆顶拿出,将数组k+1位置放入,那么数组第二小元素一定是堆顶,重复操作,直至数组遍历完成。最后将堆中数据依次拿出即可。(有剩余)
给出代码:
#include<iostream>
#include<queue>
using namespace std;
int main(){priority_queue<int,vector<int>,greater<int> >minheap;int arr[12]={9,6,3,8,2,1,4,2,6,5,7,3};int k=11;//这里方便测试便直接设定为11(数组肯定满足大家可以自己找例子) int n=12;//priority_queue<int,vector<int>,less<int> >maxheap;for(int j=0;j<=k;j++){minheap.push(arr[j]);} arr[0]=minheap.top();minheap.pop();int i=k+1,count=1;while(i<n){minheap.push(arr[i]);arr[i-k]=minheap.top();minheap.pop();i++;count++;}while(!minheap.empty()){arr[count++]=minheap.top();minheap.pop();}for(int j=0;j<n;j++){cout<<arr[j]<<" ";}
}
这里我直接使用了C++容器priority_queue,大家可以自行搜索使用方法,这就是我们之前自己创建的最大堆最小堆,不懂得小伙伴可以看我之前的文章:堆结构和堆排序-CSDN博客
本次分享到此结束,大家多多支持!!