练习:归并排序算法实现

#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]);

	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值