今天写了个分治算法。拿出来大家提提意见
测试,对一亿条随机数进行排序,需要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);
}