堆排序

这篇博客介绍了如何在字节跳动面试中遇到的实时整数数据流中位数计算问题,作者提出了使用单调队列的方法,虽然在面试中未能完整解答,但后来了解到正确解决方案是利用堆。堆排序的实现包括了建堆、局部调整heapify、建堆以及排序的过程。代码示例展示了C++实现堆排序的详细步骤,并给出了测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字节面试考到的知识点,对输入整数数据流取中位数,面试当时想到了单调队列的方法,维护一个单调队列总的时间复杂度为O(n^2),现场没撕出来,后来去leetcode提交最后一个测试案例超时

不过想法应该是对的,后来看答案是用堆的调整O(nlogn),复习下堆排序,

1.堆排序c++实现

1.1 准备

排序需要借助一个交换函数swap可以自己实现也可以用c++的实现

#include<bits/stdc++.h>
using namespace std;

void swap(int arr[], int a, int b){
	int tmp = arr[a];
	arr[a] = arr[b];
	arr[b] = tmp;
	return ;
}

1.2 堆的局部调整heapify

排序数组的长度为n,heapify将子结点较大的数移动到i的位置,最好的情况如果i为最大则则不需调整,最坏的情况一直调整到叶子结点调整的次数为树的高度,即O(log(n))

//时间复杂度为 O(logn) ,AdjustDown
void heapify(int arr[], int n, int i){
	int c1 = 2 * i + 1; // 左结点
	int c2 = 2 * i + 2; // 右结点
	int max = i;
	if(c1 < n && arr[c1] > arr[max]){
		max = c1;
	}
	if(c2 < n && arr[c2] > arr[max]){
		max = c2;
	}
	if(max != i){
		swap(arr, i, max);
		heapify(arr, n, max);
	}
}

1.3 建堆

//时间复杂度为 O(logn) 
void buildheap(int arr[], int n){
	int l = (n - 1)/2; // 最后一个需要调整的结点位置
	for(int i = l; i>=0 ;i--){
		heapify(arr, n, i);
	}
} 

1.4 堆排序

将堆的第一个数和最后一个数交换,调整堆的长度减小1,

//时间复杂度为 O(nlogn) 
void heapsort(int arr[], int n){
	
	for(int i=n;i>0;i--){
		swap(arr, 0, i-1);
		buildheap(arr, i-1);
	}
} 

1.5 测试


int main(){
	
	int arr[7] = {1,31,1,0,0,5,4};
	cout<<"开始建堆"<<endl; 
	buildheap(arr, 7);
	
	for(int i=0;i<7;i++){
		cout<<arr[i]<<endl;
	}
	cout<<"开始排序"<<endl;
	heapsort(arr, 7);
	for(int i=0;i<7;i++){
		cout<<arr[i]<<endl; 
	} 
	return 0;
} 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值