01/10/2018, 14:45

Merge Sort trong C bị lặp vĩnh viễn

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <conio.h>

 typedef struct
 {
 	char name[10];
 	int win,lose,hoa;
 	int score;
 }BangXepHang;

 BangXepHang* Nhap(BangXepHang *_BXH, int _sodoi)
 {
 	int i =0;
 	for(i; i<_sodoi;i++)
 	{
 		printf("Ten doi bong : ");
 		scanf("%s",&(_BXH+i)->name);
 		printf("so trang thang : ");
 		scanf("%d",&(_BXH+i)->win);
 		printf("so trang thua : ");
 		scanf("%d",&(_BXH+i)->lose);
 		printf("so trang hoa : ");
 		scanf("%d",&(_BXH+i)->hoa);
 	}
 	
 	return _BXH;
 }
 BangXepHang Xuat(BangXepHang *_BXH, int _sodoi)
 {
 	int i=0;
 	for(i;i<_sodoi;i++)
 	{
 		printf("Doi %s 
",(_BXH+i)->name);
 		printf("Win	Lose	Hoa
");
 		printf(" %d 	 %d 	 %d 
",(_BXH+i)->win,(_BXH+i)->lose, (_BXH+i)->hoa);
 	}
 }
 void Score(BangXepHang* _BXH,int _sodoi)
 {
 	int i;
 	for(i =0;i<_sodoi;i++)
 	{
 		(_BXH+i)->score = ((_BXH+i)->win)*8 + (_BXH +i)->lose;
 	}
 }

 void Merge(BangXepHang *_BXH, int low, int mid, int high)
 {
 	int i = low, k = mid+1;
 	int m =0;
 	BangXepHang *temp = (BangXepHang*)malloc(high*(sizeof(BangXepHang)));
 	while(i<mid+1 && k<high)
 	{
 		if((_BXH+i)->score < (_BXH+k)->score)
 		{
 			strcpy((temp+m)->name,(_BXH+k)->name);
 			(temp +m)->win = (_BXH +k)->win;
 			(temp +m)->lose = (_BXH+k)->lose;
 			(temp +m)->hoa = (_BXH+k)->hoa;
 			(temp+m)->score = (_BXH +k)->score;
 			m++;
 			k++;
 		}
 		else{
 			strcpy((temp+m)->name,(_BXH+i)->name);
 			(temp +m)->win = (_BXH +i)->win;
 			(temp +m)->lose = (_BXH+i)->lose;
 			(temp +m)->hoa = (_BXH+i)->hoa;
 			(temp+m)->score = (_BXH +i)->score;
 			m++;
 			i++;
 		}
 	}
 	while(i<mid+1)
 	{
 		strcpy((temp+m)->name,(_BXH+i)->name);
 		(temp +m)->win = (_BXH +i)->win;
 		(temp +m)->lose = (_BXH+i)->lose;
 		(temp +m)->hoa = (_BXH+i)->hoa;
 		(temp+m)->score = (_BXH +k)->score;
 		i++; m++;
 	}
 	while(k < high)
 	{
 		strcpy((temp+m)->name,(_BXH+k)->name);
 		(temp +m)->win = (_BXH +k)->win;
 		(temp +m)->lose = (_BXH+k)->lose;
 		(temp +m)->hoa = (_BXH+k)->hoa;
 		(temp+m)->score = (_BXH +k)->score;
 		m++;
 		k++;
 	}
 	
 	int n=0;
 	for(n;n<high;n++){
 		strcpy((_BXH+n)->name,(temp+n)->name);
 		(_BXH+n)->win = (temp+n)->win;
 		(_BXH+n)->lose = (temp+n)->lose;
 		(_BXH+n)->hoa = (temp+n)->hoa;
 		(_BXH+n)->score = (temp+n)->score;
 	}
 	
 	free(temp);
 }
 void Sort(BangXepHang* _BXH,int low, int _sodoi)
 {
 	if(low < _sodoi)
 	{
 		int mid = (_sodoi - low)/2;
 		Sort(_BXH,low,mid);
 		Sort(_BXH,mid+1,_sodoi);
 		Merge(_BXH,low,mid,_sodoi);
 	}	
 }
 int main()
 {
 	BangXepHang *BXH;
 	int sodoi =0;
 	printf("Nhap so doi bong : ");
 	scanf("%d",&sodoi);
 	fflush(stdin);
 	BXH = (BangXepHang*) malloc(sodoi*(sizeof(BangXepHang)));
 	BXH = Nhap(BXH,sodoi);
 	Sort(BXH,0,sodoi);
 	Xuat(BXH,sodoi);
 	return 0;
 }

Mình debug thì nó chạy với hàm Sort rồi loop vô tận ở đó luôn, khi nhập array có 2 phần tử thì ok, nhưng nhập số 3 vào là nó loop liền @@. Các bác giúp mình vụ này với. thanks !

rogp10 viết 16:54 ngày 01/10/2018
  1. Công thức mid sai.
  2. Phần copy thớt viết riêng 1 hàm thôi rồi gọi lại.
Bài liên quan
0