堆排序c++实现
#include<iostream>
#include<vector>
using namespace std;
void heapify(vector<int>&vec,int n,int index)
{
if(index >= n)
{
return;
}
int leftIndex = 2*index + 1;
int rightIndex = 2*index + 2;
int maxIndex = index;
if(leftIndex <n && vec[maxIndex] < vec[leftIndex])
{
maxIndex = leftIndex;
}
if (rightIndex < n && vec[maxIndex] < vec[rightIndex])
{
maxIndex = rightIndex;
}
if (maxIndex != index)
{
swap(vec[maxIndex],vec[index]);
heapify(vec,n,maxIndex);
}
}
void buildHeap(vector<int>&vec)
{
//如果你画出堆的结构,你会发现从index开始,就可以构建堆,不用从vec.size()-1开始
int endIndex = vec.size()-1;
int index = (endIndex-1)/2;
for(int i = index;i>= 0;i--)
{
heapify(vec,vec.size(),i);
}
}
void heapSort(vector<int>&vec)
{
//堆排序的第一步是创建堆
buildHeap(vec);
for (int i = vec.size()-1;i>=1;i--)
{
swap(vec[i],vec[0]);
heapify(vec,i,0);//这个i表示vec用于排序的终止索引,堆排序是把大根堆堆顶和最后一个索引交换
}
}
int main()
{
//heapSort
int a[] = {2,8,7,4,0,3,5,9,1,6};
vector<int>vec(a,a+10);
heapSort(vec);
return 0;
}