小顶堆排序的实现

来源:互联网 发布:淘宝流量高峰期查询 编辑:程序博客网 时间:2024/06/08 16:02

1、堆排序 第一步都是先建堆,在一个数组上建堆其实就是对数组的调整,使之满足小顶堆的特性。

父节点小于子节点。建立完成堆之后 就是每次把堆顶和堆的最后一个元素交换。交换之后的堆除了堆顶元素之外都满足小顶堆的要求。这时只需要对堆顶元素进行下沉,找到其合适的位置。


代码如下:

void modify(int *szArray, int i, int length){    int iNode = i;    int iLeft = iNode*2 + 1;    int iRight = iNode*2 + 2;    if(iNode > length/2)    {        return;    }    if (iLeft < length && szArray[iLeft] <= szArray[iNode])    {        iNode= iLeft;    }    if (iNode != i)    {        swap(szArray[iNode], szArray[i]);        modify(szArray, iNode, length);    }    if (iRight < length && szArray[iRight] <= szArray[iNode])    {        iNode= iRight;    }    if (iNode != i)    {        swap(szArray[iNode], szArray[i]);        modify(szArray, iNode, length);    }}void buildHead(int *p, int len){    int treeNode;    for (treeNode = (len-1)/2; treeNode >= 0; treeNode--)    {        modify(p, treeNode, len);    }}/* 向下调整主要用于排序*/void heap_shift_down(int *ptr,int pos, int len){    int min;            //设置最小元素下标    int index = pos;    while (index*2+1 < len)    {        min = index * 2+1;        if (index*2+2 < len)// 存在右节点        {            if (ptr[index*2+2] < ptr[min])            {                min = index * 2 +2;            }        }        if (ptr[index] <= ptr[min])        {            break;        }        else        {            swap(ptr[pos], ptr[min]);            index = min;        }    }}int headSort(int *p, int len){    buildHead(p, len);    for(int i = len - 1;i >= 0; i--)    {        swap(p[0], p[i]);// 把最小的元素与后面的值交换        heap_shift_down(p,0,i-1);// 此时第一个元素不满足小顶堆 进行下沉操作    }    for (int n = 0; n < len; n++)    {        printf("%d\n", p[n]);    }    return 1;}


0 0
原创粉丝点击