分治算法实现

今天写了个分治算法。拿出来大家提提意见

测试,对一亿条随机数进行排序,需要52秒

Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz

memory 2G

ubuntu 9.0.4

 

.c

#include "Partition.h"

static void SortInOrder(int *piArray, int iFromA, int iToA, int iFromB, int iToB, int *pA, int *pB)
{
    int iLoop, jLoop;
    int iSizeA, iSizeB;
    int *pTmp;

    iSizeA = iToA - iFromA + 1;
    iSizeB = iToB - iFromB + 1;

    for(iLoop = 0; iLoop < iSizeA; iLoop++) {
        pA[iLoop] = piArray[iFromA + iLoop];
    }
    for(iLoop = 0; iLoop < iSizeB; iLoop++) {
        pB[iLoop] = piArray[iFromB + iLoop];
    }
    pTmp = piArray + iFromA;
    for(iLoop = 0, jLoop = 0; iLoop < iSizeA && jLoop < iSizeB; ) {
        //前小后大
        if(pA[iLoop] > pB[jLoop]) {
            *pTmp = pB[jLoop];
            jLoop++;
        } else {
            *pTmp = pA[iLoop];
            iLoop++;
        }
        pTmp++;
    }
    if(jLoop == iSizeB) {
        for(; iLoop < iSizeA; iLoop++, pTmp++) {
            *pTmp = pA[iLoop];
        }
    }
}

static void PartitionPart(int * piArray, int iFrom, int iTo, int *pA, int *pB)
{
    if(iTo - iFrom < 1) { //只有两个元素的时候
        return ;
    }
    int iCenter = (iTo - iFrom) / 2 + iFrom;
    PartitionPart(piArray, iFrom, iCenter, pA, pB);
    PartitionPart(piArray, iCenter + 1, iTo, pA, pB);
    SortInOrder(piArray, iFrom, iCenter, iCenter + 1, iTo, pA, pB);
}


//利用分治算法进行排序
void PartitionSort(int * piArray, int iSize)
{
    int *pA, *pB;
    pA = (int *) malloc((iSize + 1) / 2 * sizeof(int));
    pB = (int *) malloc((iSize + 1) / 2 * sizeof(int));
    if(pA == NULL || pB == NULL) {
        printf("malloc error:%s %d/n", __FILE__, __LINE__);
        exit(-1);
    }
    PartitionPart(piArray, 0, iSize - 1, pA, pB);
    free(pB);
    free(pA);
}

 

.h

#ifndef _PARTITION_H_
#define _PARTITION_H_
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>


void PartitionSort(int * piArray, int iSize);

#endif

 

 

 

后面又把其中的一个函数修改了一下,速度到达了49秒

static void PartitionPart(int * piArray, int iFrom, int iTo, int *pA, int *pB)
{
    if(iTo - iFrom <= 3) { //只有两个元素的时候
        int iTmp;
        int iLoop;
        int jLoop;
        for(iLoop = iFrom + 1; iLoop <= iTo; iLoop++) {
            for(jLoop = iLoop - 1; jLoop >= iFrom; jLoop--) {
                if(piArray[jLoop] <= piArray[jLoop + 1]) {
                    break;
                }
                iTmp = piArray[jLoop + 1];
                piArray[jLoop + 1] = piArray[jLoop];
                piArray[jLoop] = iTmp;
            }
        }
        return ;
    }
    int iCenter = (iTo - iFrom) / 2 + iFrom;
    PartitionPart(piArray, iFrom, iCenter, pA, pB);
    PartitionPart(piArray, iCenter + 1, iTo, pA, pB);
    SortInOrder(piArray, iFrom, iCenter, iCenter + 1, iTo, pA, pB);
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值