/*希望你能看懂*/
/*所谓大顶堆,就是堆顶的元素是目前所有元素的最大的哪一个 每次建立堆后就第一个 */
/*元素和无序的最后一个元素进行交换,这样交换完了之后,整个元素就是呈现从小到大的 */
/*顺序进行排列的 下面的程序就是以大顶堆的形式进行处理的 */
int heapSort(vector<int>& nums) {
int size = nums.size(); //构建堆的大小
bulidheap(nums,size); //第一次建立一个堆
for(int i = nums.size() -1 ; i>=0; --i)
{
//由于建堆之后第一个是单前最大的元素,所以 进行交换,使得最后一个元素变成最大的元素
swap(nums[i] ,nums[0]);
--size;
maxheapify(nums,0,size);
}
return nums;
}
void bulidheap(vector<int> &nums,int size)
{
for(int j = size /2;j>=0; --j)
{
maxheapify(nums,j,size);
}
}
void maxheapify(vector<int> &nums,int i,int size)
{
int left = i*2+1;
int right = i*2+2;
int largest = i;
if(left < size && nums[left] > nums[largest]) //判断左边是否大于根 然后最大索引
{
largest = left;
}
if(right <size && nums[right] > nums[largest]) //判断右边是否大于根
{
largest = right;
}
if(largest != i) //最大值的索引有变化,说明需要交换
{
swap(nums[largest],nums[i]); //将最大值和目前的堆顶进行交换
maxheapify(nums,largest,size);
}
}
以留备案,仅供参考,
力扣第215题:数组中的第k个最大元素,就是利用堆排序,进行稍微处理
飞机票:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/