小伙伴们大家好,今天为大家带来一道算法题:
分析题意我们可知:数组最小元素一定位于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博客
本次分享到此结束,大家多多支持!!