//要想实现堆排序 首先需要实现一个大根(小根)堆
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
static vector<int> vec;
static void myswap(int i,int j){
int temp = vec[i];
vec[i] = vec[j];
vec[j] = temp;
}
//将堆结构想象成一个完成二叉树,那么有以下结论
//1. 左孩子的下标值为 2*i + 1
//2. 右孩子的下标值为 2*i + 2
//3. 父节点的下标值为 (i - 1)/2
static void push(vector<int>& vec,int value){
vec.push_back(value);
heapInsert(vec,vec.size() - 1);
}
static int pop(vector<int>& vec){
int ans = vec[0];
swap(0,vec.size() - 1);
vec.erase(vec.end() - 1);
heapify(0,vec.size());
return ans;
}
//调整index 上的值 向下调整
//heapSize 调整的最大位置
static void heapify(vector<int>& vec,int index,int heapSize){
int left = 2 * index + 1;
while(left < heapSize){
int largest = left + 1 < heapSize && vec[left] < vec[left + 1] ? left + 1 : left;
largest = vec[largest] > vec[index] ? largest : index;
if(largest == index)
break;
swap(largest,index);
index = largest;
left = 2 * index + 1;
}
}
//index 要调整的下标
static void heapInsert(vector<int>& vec,int index){
// vec.push_back(value);
int root = (index - 1) / 2; //父节点位置
while(vec[index] > vec[root]){
myswap(vec,self,root);
index = root;
root = (self - 1) / 2;
}
}
//如上是实现堆结构
//如下实现堆排序
static void heapSort(vector<int>& vec){
//O(N* logN) 调整成大根堆 从跟往下调整
for(int i = 0; i < vec.size();i++){
heapInsert(vec,i);
}
//O(N) 从叶子往跟调整
// for(int i = vec.size() - 1;i >= 0;i--){
// heapify(vec,i,vec.size());
// }
int heapSize = vec.size();
swap(vec,0,--heapSize);
while(heapSize > 0){
heapify(vec,0,heapSize);
swap(vec,0,--heapSize);
}
}
int main(int argc, char const *argv[])
{
heapInsert(vec,3);
heapInsert(vec,4);
heapInsert(vec,5);
cout << vec[0] << endl;
return 0;
}
C语言实现堆结构及堆排序
最新推荐文章于 2022-08-21 21:58:06 发布