堆排序

这个接口写的不好,用起来感觉有点别扭,真正要用还需要改改,不应该使用iSize。

感觉把堆当成一个能insert,然后弹出最大的数据的结构使用比较好一些。

另外最好再添加一些如:GetMaxValue,等等的函数

多个已经排好序的连接合成一个,这个用堆排序真的很好,不错。

 

主要实现了基于堆的排序

对一亿条数据进行测试的结果为:Push,6s;Pop,97s。

如果对于一个需要插入要求高的地方还是可以使用的。

 

 

//#include "HeapSort.h"

#include <stdio.h>

#include <stdlib.h>

 

 

//现在数组的大小

void Push(int *piArray, int & iSize, const int iInsert)

{

    int iIdx;

    int iIdxNew;

    int iTmp;

 

    iIdx = iSize;

    piArray[iIdx] = iInsert;

 

    while(iIdx != 0) {

        iIdxNew = (iIdx - 1) / 2;

        if(piArray[iIdxNew] >= piArray[iIdx]) {

            break;

        }

        iTmp = piArray[iIdxNew];

        piArray[iIdxNew] = piArray[iIdx];

        piArray[iIdx] = iTmp;

        iIdx = iIdxNew;

    }

    iSize++;

}

 

//Size 现在数组的大小

int Pop(int *piArray, int& iSize, int &iPop)

{

    int iIdx = 0;

    int iIdxNew;

    int iLeft, iRight;

    int iTmp;

    int iMax;

 

    if(iSize <= 0) {

        return -1;

    }

    iPop = piArray[0];

    if(iSize == 2) {

        piArray[0] = piArray[1];

    }

 

    piArray[0] = piArray[iSize - 1];

 

    while(2 * iIdx + 1 <= iSize - 2) {

        iLeft = piArray[iIdx * 2 + 1];

        if(2 * iIdx + 1 == iSize - 2) { //只还有个左孩子,没有右孩子了

            iTmp = piArray[iIdx];

            if(iLeft > iTmp) {

                piArray[iIdx] = iLeft;

                piArray[iIdx * 2 + 1] = iTmp;

            }

            break;

        }

        iRight = piArray[iIdx * 2 + 2];

        iTmp = piArray[iIdx];

        if(iLeft > iRight) {

            iIdxNew = iIdx * 2 + 1;

            iMax = iLeft;

        } else {

            iIdxNew = iIdx * 2 + 2;

            iMax = iRight;

        }

        if(iMax > iTmp) {

            piArray[iIdx] = iMax;

            piArray[iIdxNew] = iTmp;

            iIdx = iIdxNew;

        } else {

            break;

        }

 

    }

    iSize--;

    return 0;

}

 

/*

int main()

{

    int iArray[] = {1, 3, 5, 100, 1000, 30, 57, 8, 7, 6, 5, 4, 2};

    int iArraySort[100];

    int iSize = 0;

    int iNum = sizeof(iArray) / sizeof(iArray[0]);

    int iLoop;

 

    for(iLoop = 0; iLoop < iNum; iLoop++) {

        Push(iArraySort, iSize, iArray[iLoop]);

    }

    int iSizeConst = iSize;

    int iPop;

    for(iLoop = 0; iLoop < iSizeConst; iLoop++) {

        if(Pop(iArraySort, iSize, iPop) == -1) {

            printf("pop error/n");

        }

        printf("%d/n", iPop);

    }

    return 0;

}

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值