归并算法,我当初看这个算法时觉得相当容易的感觉,但写起来确实很糟糕,总之写起来很微妙的感觉,改了许多次终于正确了。
#include<string>
#include<cstdio>
void Merge_Sort(int *iStart=NULL,int *iEnd=NULL,int *iResult=NULL){
if(iResult==NULL){iResult=iStart;}
if(iStart>=iEnd)return;
if(iEnd-iStart==1){*iResult=*iStart;return;}
int iAmount=iEnd-iStart;
int iMiddle=iAmount/2;
int *iLeft=(int*)malloc(iMiddle*sizeof(int));
int *iRight=(int*)malloc((iAmount-iMiddle)*sizeof(int));
Merge_Sort(iStart,iStart+iMiddle,iLeft);
Merge_Sort(iStart+iMiddle,iEnd,iRight);
int iLoop1=0,iLoop2=0;
while(iLoop1+iLoop2<iAmount){
while(iLoop1<iMiddle&&(iLoop2>=(iAmount-iMiddle)||*(iLeft+iLoop1)<=*(iRight+iLoop2))){
*(iResult+iLoop1+iLoop2)=*(iLeft+iLoop1);
iLoop1++;
}
if(iLoop2>=(iAmount-iMiddle))break;
*(iResult+iLoop1+iLoop2)=*(iRight+iLoop2);
iLoop2++;
}
free(iLeft);
free(iRight);
return;
}
int main(){
int test[]={1,3,5,7,9,2,4,6,8,10,2,3,1,4,6,5,7,9,8,0};
Merge_Sort(test,test+sizeof(test)/4);
int iAmount=sizeof(test)/4;
printf("Amount:%d\n",iAmount);
int *p=test;
while(iAmount--){printf("%d ",*p);p++;}
printf("\n");
return 0;
}