#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
int readdata(int *buf,int len,char *filename){
int fd = open(filename,O_RDONLY);
int i;
int pos=0;
if(fd > 0 ){
int l =0;
lseek(fd,0,SEEK_SET);
l= lseek(fd,0,SEEK_END);
printf("len l:%d \n",l);
lseek(fd,0,SEEK_SET);
for( i =0 ;i < l; i++){
char c[2];
read(fd,c,1);
if((c[0] !=' ' )&&( c[0] !='\n')){
buf[pos]=buf[pos]*10+atoi(c);
}else if(c[0] == ' '){
if(++pos > len)break;
}
}
printf("\n");
close(fd);
return pos;
}else{
printf("open file:%s error \n",filename);
perror("open");
}
return -1;
}
int recumerge(int *srcl, int *srcr,int *dst,int len){
int i =0,j=0;
int posl=0,posr=0;
printf("len:%d \n",len);
if(len==2){
printf("srl:%d srcr:%d \n",*srcl,*srcr);
if(*srcl < *srcr){
dst[0]=*srcl;
dst[1]=*srcr;
}else{
dst[0]=*srcr;
dst[1]=*srcl;
}
return 1;
}else if(len==1){
dst[0]=*srcl;
return 1;
}
int *tmpl=malloc(len*sizeof(int)/2);
int *tmpr=malloc(len*sizeof(int)-len*sizeof(int)/2);
recumerge(srcl,srcl+len/4,tmpl,len/2);
recumerge(srcr,srcr+(len/2-len/4),tmpr,len-len/2);
/*
printf("posl \n");
for(i=0; i< len/2;i++)
printf(" %d",tmpl[i]);
printf("\nposr \n");
for(i=0; i< len-len/2;i++)
printf(" %d",tmpr[i]);
printf("\n");
*/
for(i=posl; i< len/2;i=posl){
if(tmpl[posl]<tmpr[posr] || posr >len-len/2-1){
dst[posl+posr]=tmpl[i];
posl++;
}
else{
dst[posl+posr]=tmpr[posr];
posr++;
}
}
for(j=posr; j< len-len/2; j++){
dst[posl+posr]=tmpr[posr];
posr++;
}
/*
for(j=0; j < posr+posl;j++)
printf(" :%d ",dst[j]);
printf("\n");
*/
free(tmpl);
free(tmpr);
}
int main(int argc, char *argv[]){
int BUF_LEN=1024;
int buf[BUF_LEN];
int bufdst[BUF_LEN];
int len=0;
int i =0;
if(argc>1){
len = readdata(buf,BUF_LEN,argv[1]);
if(len > 0 ){
for(i=0 ;i < len; i++)
printf(" :%d ",buf[i]);
printf(" data end\n");
}
recumerge(buf,buf+len/2,bufdst,len);
for(i=0 ;i < len; i++)
printf(" :%d ",bufdst[i]);
}
}
练习:归并排序算法实现
最新推荐文章于 2023-03-15 00:08:21 发布