c/c++后台开发必知堆与栈的区别( 四 )
因此 , 完成堆排序并没有用到前面说明的插入操作 , 只用到了建堆和节点向下调整的操作 , 堆排序的操作如下:
//array:待排序数组 , len:数组长度void heapSort(int array[],int len) { //建堆 makeMinHeap(array,len);//最后一个叶子节点和根节点交换 , 并进行堆调整 , 交换次数为len-1次 for(int i=len-1;i>0;--i) {//最后一个叶子节点交换array[i]=array[i]+array[0];array[0]=array[i]-array[0];array[i]=array[i]-array[0];//堆调整minHeapFixDown(array, 0, len-i-1);}}
(1)稳定性 。 堆排序是不稳定排序 。
(2)堆排序性能分析 。 由于每次重新恢复堆的时间复杂度为O(logN) , 共N-1次堆调整操作 , 再加上前面建立堆时N/2次向下调整 , 每次调整时间复杂度也为O(logN) 。 两次操作时间复杂度相加还是O(NlogN) , 故堆排序的时间复杂度为O(NlogN) 。
最坏情况:如果待排序数组是有序的 , 仍然需要O(NlogN)复杂度的比较操作 , 只是少了移动的操作;
最好情况:如果待排序数组是逆序的 , 不仅需要O(NlogN)复杂度的比较操作 , 而且需要O(NlogN)复杂度的交换操作 , 总的时间复杂度还是O(NlogN) 。
因此 , 堆排序和快速排序在效率上是差不多的 , 但是堆排序一般优于快速排序的重要一点是数据的初始分布情况对堆排序的效率没有大的影响 。
- 黑莓(BB.US)盘前涨逾32%,将与亚马逊开发智能汽车数据平台|美股异动 | US
- 开发自|不妥协不追随 Member’s Mark升级背后的“山姆哲学”
- 确认|三星确认正在开发“轻薄轻巧”的可折叠手机
- 推广|Josh Elman加盟苹果 负责开发者关系与软件推广工作
- 微信广告|小程序开发者看过来 流量变现倍增的秘籍来了!
- 移植|开发者将移植ARM Mac的Linux系统 但需要得到资金支持
- GNOME|[图]GNOME启动Circle项目:进一步扩大开发者规模
- 检查|填补软件开发市场空白,飞算全自动软件工程平台瞄准全自动后端微服务开发
- 格式化|利用好这3个隐藏技巧,Power BI 开发体验更丝滑
- 开发|三七数字产业平台率先在全国开发应用