首页
社区
课程
招聘
[求助][求助]请各位大牛帮忙看下这个排序函数,看不明白
发表于: 2011-11-3 22:57 4159

[求助][求助]请各位大牛帮忙看下这个排序函数,看不明白

2011-11-3 22:57
4159
typedef struct _DLINK DLINK;
struct _DLINK{
    DLINK *pNext, *pPrev;
};

typedef struct _DLIST{
	UINTN Size;
	DLINK *pHead, *pTail;
} DLIST;

VOID SortList(DLIST *List,  COMPARE_FUNCTION Compare){
    DLIST MergeList;
    DLINK *p, *q, *e;
    UINTN pSize, qSize, inSize;
    UINT32 NoMerges;
    UINTN i;

    if(List->Size <= 1)  //nothing to sort
        return;

    inSize = 1;
    MergeList = *List;

    while(1)
    {
        p = MergeList.pHead;
        DListInit(&MergeList);      //clear list  DlistInit()是把链表初始化为空,没有节点
        NoMerges = 0;

        while(p != NULL)
        {
            NoMerges++;
            q = p;
            for(i = 0, pSize = 0; i < inSize; i++)
            {
                pSize++;
                q = q->pNext;
                if(q == NULL)
                    break;
            }

            qSize = inSize;
            while(pSize > 0 || (qSize > 0 && q != NULL))
            {
               if(pSize == 0)
                {
                    e = q;
                    q = q->pNext;
                    DListAdd(&MergeList, e);
                    qSize--;
                }
                else if(qSize == 0 || q == NULL)
                {
                    e = p;
                    p = p->pNext;
                    DListAdd(&MergeList, e);     //DListAdd() 是把节点e添加到链表MergeList末尾
                    pSize--;
                }
                else if(Compare(p, q) > 0)       //compare() 比较节点p,q的大小
                {
                    e = q;
                    q = q->pNext;
                    DListAdd(&MergeList, e);
                    qSize--;
                }
                else
                {
                    e = p;
                    p = p->pNext;
                    DListAdd(&MergeList, e);
                    pSize--;
                }
            }
            p = q;
        }
        if(NoMerges <= 1)
            break;
        inSize *= 2;
    }
    *List = MergeList;
}

sortlist(); 是根据什么规则排序的?

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 58
活跃值: (1090)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个函数没人看明白吗??
2011-11-3 23:12
0
雪    币: 826
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
压力很大,能力有限啊,你放些实际数据试试先。
2011-11-3 23:40
0
雪    币: 207
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
貌似是归并排序
2011-11-4 00:17
0
雪    币: 58
活跃值: (1090)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个是BIOS source code 里面的一个函数!
2011-11-4 08:10
0
雪    币: 202
活跃值: (69)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
如果我没理解错的话,应该是希尔排序。
2011-11-4 11:26
0
雪    币: 58
活跃值: (1090)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
确实有点像归并排序!!
2011-11-4 14:14
0
游客
登录 | 注册 方可回帖
返回
//