排序算法之堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构(通常堆是通过一维数组来实现的),并同时满足堆的性质:即子结点的键值总是小于(或者大于)它的父节点。

我们可以很容易的定义堆排序的过程:

1.创建一个堆

2.把堆顶元素(最大值)和堆尾元素互换

3.把堆的尺寸缩小1,并调用heapify(A, 0)从新的堆顶元素开始进行堆调整

4.重复步骤2,直到堆的尺寸为1

分类--------------内部比较排序

数据结构----------数组

最差时间复杂度---- O(nlogn)

最优时间复杂度---- O(nlogn)

平均时间复杂度---- O(nlogn)

所需辅助空间------ O(1)

稳定性------------不稳定

#include

usingnamespacestd;

intheapsize;//堆大小

voidexchange(intA[],inti,intj)//交换A[i]和A[j]

{

inttemp = A[i];

A[i] = A[j];

A[j] = temp;

}

voidheapify(intA[],inti)//堆调整函数(这里使用的是最大堆)

{

intleftchild =2* i +1;//左孩子索引

intrightchild =2* i +2;//右孩子索引

intlargest;//选出当前结点与左右孩子之中的最大值

if(leftchild A[i])

largest = leftchild;

else

largest = i;

if(rightchild A[largest])

largest = rightchild;

if(largest != i)

{

exchange(A, i, largest);//把当前结点和它的最大(直接)子节点进行交换

heapify(A, largest);//递归调用,继续从当前结点向下进行堆调整

}

}

voidbuildheap(intA[],intn)//建堆函数

{

heapsize= n;

for(inti =heapsize/2-1; i >=0; i--)//对每一个非叶结点

heapify(A, i);//不断的堆调整

}

voidheapsort(intA[],intn)

{

buildheap(A, n);

for(inti = n -1; i >=1; i--)

{

exchange(A,0, i);//将堆顶元素(当前最大值)与堆的最后一个元素互换(该操作很有可能把后面元素的稳定性打乱,所以堆排序是不稳定的排序算法)

heapsize--;//从堆中去掉最后一个元素

heapify(A,0);//从新的堆顶元素开始进行堆调整

}

}

intmain()

{

intA[] = {5,2,9,4,7,6,1,3,8};//从小到大堆排序

intn =sizeof(A) /sizeof(int);

heapsort(A, n);

printf("堆排序结果:");

for(inti =0; i < n; i++)

{

printf("%d ", A[i]);

}

printf("\n");

return0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,235评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,747评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,288评论 0 2
  • 时间复杂度:O(Nlog(N))额外空间复杂度:O(1)是否可实现稳定性:否 思路: 把数组逻辑上看成一个二叉树,...
    一凡呀阅读 667评论 0 0
  • “百度知道”,是用户自己根据具有针对性地提出问题,通过积分奖励机制发动其他用户,来解决该问题的搜索模式。 同时,这...
    1bb897ae932e阅读 241评论 0 1