堆排序

来源:互联网 发布:sql 表中复制数据 编辑:程序博客网 时间:2024/06/02 22:28

堆排序(Heap Sort)
1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Heap Sort )

它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素,对应的是完全二叉树,堆分为大顶堆和小顶堆。

对于堆的详细概念,可见博文堆的实现以及优先级队列

堆的构建:

利用数组下标之间的关系,将数组想象称为一个完全二叉树,如下图:
这里写图片描述

下面以升序为例:

如果要对待排序列进行升序排列,需要建立一个大堆,每次从堆顶拿出最大的记录,放在数组的最后一个位置,然后在进行一次调整堆,然后重复执行直到整个序列有序。

void AdJustDown(int* array,int root,int size){    int parent = root;    int child = (root << 1)+1;    while(child < size)    {        if(child + 1 < size && array[child + 1] > array[child])//默认让两个孩子中较大的作为右结点            ++child;        if(array[child] > array[parent])        {            //如果child大于parent,就进行交换            swap(array[child],array[parent]);            parent = child;//被调下来的父节点再次和自己的孩子比较            child = (child << 1) + 1;        }        else        {            break;        }    }}void HeapSort(int* array,int size){    for(int root = ((size - 2)>>1);root>=0;--root)    {        AdJustDown(array,root,size);    }    //每次选出最大的,放在N-1的位置上    int end - size - 1;    while(end)    {        swap(array[0],array[end]);        AdJustDown(array,0,end);        --end;    }}
原创粉丝点击