基于有序HASH树SDK应用---快速排序

1 功能实现原理
  基于有序HASH树进行排序的实现原理是把要排序的数据(整数、字符串)插入
  到HASH树中,数据再插入到树中时已经进行有序排列,然后使用SDK中的遍历函
  数按指定顺序(升序、降序)输出即可,也可调用其它函数获取最大值、最小值以及其他强大功能。

  关于有序HASH树请参考以下网址:
  http://topic.csdn.net/u/20090820/08/cd6917ee-b22e-412f-8bf1-9afd6770c7e8.html

  作者联系方式:
  e-mail:freeland007@163.com
  QQ: 723273055 

2 排序技术特点
  1、排序速度快,且每秒进行排序的速度是恒定的,是目前业内最快的排序算法
  2、可对整数(1、2、4、8字节)和字符串数据类型进行排序
  3、可进行多维排序
    可进行多维排序,就是在根据前一列进行排序后,在有相同前一列键值的内部对后续列进行排序。
    如同以下SQL语句:

    select spid,servicecode,phone from orderinfo order by spid asc, servicecode desc, phone asc

    1) 每个排序的维度可自定义数据类型
    2) 在输出结果时可每个维度指定排序的顺序(升序、降序)

  4、容量大
    可对上千万数据节点进行排序
3 排序技术指标
  1、排序速度
    1)测试环境:
      (1)32位windows xp操作系统
      (2)1G DDR2内存
      (3)CPU:AMD LE1100/1.9GHz

  2)测试指标
      (1)对4字节整数(或者小于12字节长度的字符串)进行排序
  每秒可进行140万次排序

      (2)对8字节(或者小于21字节长度的字符串)整数进行排序
  每秒可进行90万次排序

  2、遍历排序结果
    每秒可遍历1200万节点
 
  3、最大排序维度
    最大支持255个维度

  4、容量大
    可对上千万数据节点进行排序,因为每秒中的排序速度和要排序的总节点数量无关,在对大量数据节点进行排序时,
    速度不受影响。

4  单列排序示例源码

  功能:根据身份证ID(sCardID)进行单级排序。

#include <stdio.h>
#include "HashTree.h"

typedef struct _PERSONINFO
{
        char sCardID[19];
        int nSex;
        char sName[32];
        int nAge;
        char sAddress[128];
        char sEmail [128];
}PERSONINFO;
typedef PERSONINFO* LPPERSONINFO;

int AddPersonInfo(HANDLE hTree,char* sCardID, int nSex, char* sName, int nAge,  char* sAddress, char* sEmail)
{
    LPPERSONINFO pPersonInfo;
    pPersonInfo = new PERSONINFO;

    strcpy(pPersonInfo->sCardID, sCardID);
    pPersonInfo->nSex = nSex;
    strcpy(pPersonInfo->sName, sName);
    pPersonInfo->nAge = nAge;
    strcpy(pPersonInfo->sAddress, sAddress);
    strcpy(pPersonInfo->sEmail, sEmail);

    char* sMultiKey[32];
    sMultiKey[0] = pPersonInfo->sCardID;
    return(HTreeAddKey(hTree, sMultiKey, pPersonInfo));
}

bool FilterProc(LPSELECTCOND pCond)

    HANDLE hValue;
    hValue = HTreeGetCurrentValue(pCond);

    LPPERSONINFO pRetInfo;
    pRetInfo = LPPERSONINFO(hValue);
    printf("%s/r/n", pRetInfo->sCardID);

    return true;
}

int OrderSingle(HANDLE hTree, bool bAsc)
{
    SELECTCOND pSelectCond;

    pSelectCond.hTree = hTree;
    pSelectCond.nMethod[0] = RTDB_METHOD_ITERATE;
    pSelectCond.bAsc[0] = bAsc;
    pSelectCond.bEnableTop = false;
    pSelectCond.pFilterAPI = FilterProc;
    pSelectCond.pFilterPara = NULL;

    HTreeSelect(&pSelectCond);

    return 0;
}

int main(int nArgc, char* sArgv[])
{
MEMINITINFO MemInitInfo;
MemInitInfo.nSysMaxIdleCount = 1000000;
MemInitInfo.nAppMaxIdleCount = 1000000;

int nRet;
nRet = HTSysInit(&MemInitInfo);
if(nRet != 0)
{
return nRet;
}
// 生成单级有序HASH树
HANDLE hTree;
HTREEDESC TreeDesc;
TreeDesc.nColumn = 1; 
TreeDesc.nColDataType[0] = CACHE_STRING;
hTree = HTreeCreate(&TreeDesc);

// 以CardID为主键插入要排序的数据节点到有序HASH树
AddPersonInfo(hTree, "123456789012345670", 1, "张零", 20,
"广东省深圳市龙岗区0栋", "zhang0@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345672", 1, "张二", 22,
"广东省深圳市龙岗区2栋", "zhang2@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345671", 1, "张一", 21,
"广东省深圳市龙岗区1栋", "zhang1@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345678", 1, "张八", 28,
"广东省深圳市龙岗区8栋", "zhang8@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345673", 1, "张三", 23,
"广东省深圳市龙岗区3栋", "zhang3@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345676", 1, "张六", 26,
"广东省深圳市龙岗区6栋", "zhang6@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345675", 1, "张五", 25,
"广东省深圳市龙岗区5栋", "zhang5@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345677", 1, "张七", 27,
"广东省深圳市龙岗区7栋", "zhang7@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345679", 1, "张九", 29,
"广东省深圳市龙岗区9栋", "zhang9@cacheserver.com.cn");
AddPersonInfo(hTree, "123456789012345674", 1, "张四", 24,
"广东省深圳市龙岗区4栋", "zhang4@cacheserver.com.cn");

// 按升序输出排序节点并打印屏幕
OrderSingle(hTree, true);

printf("/r/n");

// 按降序输出排序节点并打印屏幕
OrderSingle(hTree, false);

HTSysDestroy();

    return 0;
}

5  多列排序示例源码
  功能:分别对SPID、SeriveCode、Phone进行多维排序。

#include <stdio.h>
#include "HashTree.h"

typedef struct _ORDERINFO
{
char sSPID[64];
char sSeriveCode [64];
char sPhone [64];
int nRemainder;
int nState;
}ORDERINFO;
typedef ORDERINFO * LPORDERINFO;

int AddOrderInfo(HANDLE hTree, char* sSPID, char* sSeriveCode, char* sPhone,
int nRemainder, int nState)
{
LPORDERINFO pOrderInfo;
pOrderInfo = new ORDERINFO;

strcpy(pOrderInfo->sSPID, sSPID);
strcpy(pOrderInfo->sSeriveCode, sSeriveCode);
strcpy(pOrderInfo->sPhone, sPhone);
pOrderInfo->nRemainder = nRemainder;
pOrderInfo->nState = nState;

char* sMultiKey[32];
sMultiKey[0] = pOrderInfo->sSPID;
sMultiKey[1] = pOrderInfo->sSeriveCode;
sMultiKey[2] = pOrderInfo->sPhone;
return(HTreeAddKey(hTree, sMultiKey, pOrderInfo));
}

bool FilterProc(LPSELECTCOND pCond)
{
HANDLE hValue;
// 获取当前数据节点的句柄值
hValue = HTreeGetCurrentValue(pCond);

LPORDERINFO pRetInfo;
pRetInfo = LPORDERINFO(hValue);
printf("%s,%s,%s/r/n", pRetInfo->sSPID, pRetInfo->sSeriveCode, pRetInfo->sPhone);

return true;
}

int AccessMultiple(HANDLE hTree, bool bAsc[])
{
SELECTCOND pSelectCond;

pSelectCond.hTree = hTree;
pSelectCond.nMethod[0] = RTDB_METHOD_ITERATE;
pSelectCond.bAsc[0] = bAsc[0];
pSelectCond.nMethod[1] = RTDB_METHOD_ITERATE;
pSelectCond.bAsc[1] = bAsc[1];
pSelectCond.nMethod[2] = RTDB_METHOD_ITERATE;
pSelectCond.bAsc[2] = bAsc[2];
pSelectCond.bEnableTop = false;
pSelectCond.pFilterAPI = FilterProc;
pSelectCond.pFilterPara = NULL;

HTreeSelect(&pSelectCond);

return 0;
}

int main(int nArgc, char* sArgv[])
{
MEMINITINFO MemInitInfo;
MemInitInfo.nSysMaxIdleCount = 1000000;
MemInitInfo.nAppMaxIdleCount = 1000000;

int nRet;
nRet = HTSysInit(&MemInitInfo);
if(nRet != 0)
{
return nRet;
}

// 生成3级有序HASH树
HANDLE hTree;
HTREEDESC TreeDesc;
TreeDesc.nColumn = 3; 
TreeDesc.nColDataType[0] = CACHE_STRING;
TreeDesc.nColDataType[1] = CACHE_STRING;
TreeDesc.nColDataType[2] = CACHE_STRING;

hTree = HTreeCreate(&TreeDesc);

nRet = AddOrderInfo (hTree, "1234567890", "abc0", "13912345671", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc0", "13912345672", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc0", "13912345673", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc1", "13912345671", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc1", "13912345672", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc1", "13912345673", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc2", "13912345671", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc2", "13912345672", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567890", "abc2", "13912345673", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc0", "13912345671", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc0", "13912345672", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc0", "13912345673", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc1", "13912345671", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc1", "13912345672", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc1", "13912345673", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc2", "13912345671", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc2", "13912345672", 123456, 0);
nRet = AddOrderInfo (hTree, "1234567891", "abc2", "13912345673", 123456, 0);

bool bAsc[32];
// 按指定顺序打印数据节点
bAsc[0] = true; // 第1级树按升序
bAsc[1] = true; // 第2级树按升序
bAsc[2] = true; // 第3级树按升序
AccessMultiple(hTree, bAsc);

printf("/r/n");

// 按指定顺序打印数据节点
bAsc[0] = true; // 第1级树按升序
bAsc[1] = false; // 第2级树按降序
bAsc[2] = true; // 第3级树按升序
AccessMultiple(hTree, bAsc);

printf("/r/n");

// 按指定顺序打印数据节点
bAsc[0] = true; // 第1级树按升序
bAsc[1] = false; // 第2级树按降序
bAsc[2] = false; // 第3级树按降序
AccessMultiple(hTree, bAsc);

printf("/r/n");

// 按指定顺序打印数据节点
bAsc[0] = true; // 第1级树按升序
bAsc[1] = false; // 第2级树按降序
bAsc[2] = false; // 第3级树按降序
AccessMultiple(hTree, bAsc);

// 按指定顺序打印数据节点
bAsc[0] = false; // 第1级树按降序
bAsc[1] = false; // 第2级树按降序
bAsc[2] = false; // 第3级树按降序
AccessMultiple(hTree, bAsc);

HTSysDestroy();

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值