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 !
Bài liên quan
mid
sai.