原来没有博客,一直讲自己学习、工作的日志写在空间里。这事还被同学小小的鄙视一下,当然都是开玩笑的,现在终于创建了自己的博客,可以把学习的记录写在这里了,学习、工作跟生活终于分家了。O(∩_∩)O哈哈~
模仿C函数库 实现合并算法 compare.C文件
#include<stdio.h>
#include<stdlib.h> #include<string.h> #include "../DataStructure/bintree.h" #ifndef _COMPARE_H
#define _COMPARE_H int intGreater(void *x,void *y){
return (*((int *)x))-(*((int *)y)); } int intLess(void *x,void *y){ return intGreater(y,x); } int charGreater(void *x,void *y){ return (*((char *)x))-(*((char *)y)); } int charLess(void *x,void *y){ return charGreater(y,x); } int strGreater(void *x,void *y){ return strcmp(*((char **)x),*((char **)y)); } int strLess(void *x,void *y){ return strGreater(y,x); } int floatGreater(void *x,void *y){ if((*((float *)x)-*((float*)y))>0.0) return 1; if((*((float *)x)-*((float*)y))<0.0) return -1; return 0; } int floatLess(void *x,void *y){ return floatGreater(y,x); } int doubleGreater(void *x,void *y){ if((*((double *)x)-*((double *)y))>0.0) return 1; if((*((double *)x)-*((double *)y))<0.0) return -1; return 0; } int doubleLess(void *x,void *y){ return doubleGreater(y,x); } int treeLess(void *x,void *y){ if((*(BinaryTree**)x)->key<(*(BinaryTree**)y)->key) return 1; if((*(BinaryTree**)x)->key>(*(BinaryTree**)y)->key) return -1; return 0; } int dblLess(void *x,void *y){ if((**(double**)x)<(**(double**)y)) return 1; if((**(double**)x)>(**(double**)y)) return -1; return 0; } #endif merget.C文件
/*两个有序序列的合并算法 Error void* used in arithmetic
*/ #ifndef _MERGE_H #define _MERGE_H void merge(void *a,int size,int p,int q,int r,int(*comp)(void *,void *)){ int i,j,k,n1=q-p+1,n2=r-q; void *L=(void *)malloc(n1*size); void *R=(void *)malloc(n2*size); memcpy(L,a+p*size,n1*size); memcpy(R,a+(q+1)*size,n2*size); i=j=0; k=p; while(i<n1&&j<n2) if(comp(L+i*size,R+j*size)<0) memcpy(a+(k++)*size,L+(i++)*size,size); else memcpy(a+(k++)*size,R+(j++)*size,size); if(i<n1) memcpy(a+k*size,L+i*size,(n1-i)*size); if(j<n2) memcpy(a+k*size,R+j*size,(n2-j)*size); free(L);L=NULL;//在有序序列合并时正确,而归并排序时会出错,去掉就可以 原因? free(R);R=NULL; } #endif mergetSort.C文件
#ifndef _MERGESORT_H
#define _MERGESORT_H #include "merge.h" void mergeSort(void *a,int size,int p,int r,int(*comp)(void *,void *)){ if(p<r){ int q=(p+r)/2; mergeSort(a,size,p,q,comp); mergeSort(a,size,q+1,r,comp); merge(a,size,p,q,r,comp); } } #endif 测试文件
#include<stdio.h>
#include "mergesort.h" #include "../Utility/compare.h" int main(int argc,char* argv){ int a[]={ 5,1,9,4,6,2,0,3,8,7 }; int i; char *b[]={ "ChongQing","ShangHai","AoMen", "TianJin","BeiJing","XiangGang" }; double c[]={ 8.5,6.3,1.7,9.2,0.5,2.3,4.1,7.4,5.9,3.7 }; mergeSort(a,sizeof(int),0,9,intGreater); for(i=0;i<10;i++){ printf("%d ",a[i]); } printf("\n"); mergeSort(b,sizeof(char *),0,5,strLess); for(i=0;i<6;i++) printf("%s ",b[i]); printf("\n"); mergeSort(c,sizeof(double),0,9,doubleGreater); for(i=0;i<10;i++){ printf("%.1lf ",c[i]); } printf("\n"); return (EXIT_SUCCESS); } ![]() |