mergetSort(2012-09-23周日 于504)--QQ空间日志迁移

本文详细介绍了如何使用C函数库实现合并算法,并提供了多个不同数据类型的比较函数和合并算法的实现,包括整数、字符、字符串、浮点数、双精度数、二叉树节点和双精度数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原来没有博客,一直讲自己学习、工作的日志写在空间里。这事还被同学小小的鄙视一下,当然都是开玩笑的,现在终于创建了自己的博客,可以把学习的记录写在这里了,学习、工作跟生活终于分家了。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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值