Code sắp xếp trộn danh sách theo tên bị sai kết quả

Em đang làm bài tập thầy giao về sắp xếp danh sách theo tên bằng thuật toán trộn

#include<iostream>
#include<iomanip>
using namespace std;
struct HS
{
	string ten;
	string hd;
	int ns;
	string dc;
};
void xuat(HS a)
{
	cout<<a.ten<<setw(10)<<a.hd<<setw(10)<<a.ns<<setw(15)<<a.dc<<endl;
}
void xuatN(HS a[],int n)
{
	for(int i=0;i<n;i++)
	{
		xuat(a[i]);
	}
}
void tron(HS a[],int l,int m,int r)
{
	HS b[m-l+1];HS c[r-m];
	for(int i=0;i<m-l+1;i++)
	{
		b[i].ten=a[l+i].ten;
	}
	for(int j=0;j<r-m;j++)
	{
		c[j].ten=a[m+1+j].ten;
	}
	int i=0,j=0,k=l;
	while(i<m-l+1&&j<r-m)
	{
		if (b[i].ten <= c[j].ten)
        {
            a[k].ten = b[i].ten;
            i++;
        }
        else
        {
            a[k].ten = c[j].ten;
            j++;
        }
        k++;
	}
	while(i<m-l+1)
	{
		a[k].ten=b[i].ten;
		i++;
		k++;
	} 
	while(j<r-m)
	{
		a[k].ten=c[j].ten;
		j++;
		k++;
	} 
}
void sapxep(HS a[],int l,int r)
{
	if(l<r) 
	{
		int m=(l+r)/2;
		sapxep(a,l,m);
		sapxep(a,m+1,r);
		tron(a,l,m,r);
	}
}
int main()
{
	HS a[6]=
	{
		{"anh","nguyen",2002,"ha noi"},
		{"duc","le",2001,"thai binh"},
		{"dung","luu",2000,"thai nguyen"},
		{"nhi","tran",2003,"hai phong"},
		{"vy","ly",2004,"nam dinh"},
		{"dan","ma",2005,"bac kan"},
	};
	sapxep(a,0,5);
	cout<<"-Danh sach sau sap xep"<<endl;
	cout<<"ten"<<setw(10)<<"hodem"<<setw(10)<<"namsinh"<<setw(15)<<"diachi"<<endl;
	xuatN(a,6);
}


Kết quả là có sắp xếp được theo tên nhưng các thông tin còn lại chưa được sắp xếp thì em nhờ mọi người giúp em với ạ.Em xin cảm ơn!

1 Like

Để sắp xếp danh sách theo tên, bạn đã viết hàm trộn (merge) đúng. Tuy nhiên, khi trộn các phần tử trong mảng, bạn chỉ cập nhật lại trường ten của mỗi phần tử, mà không cập nhật các trường khác như hd , ns , dc . Để giải quyết vấn đề này, bạn cần cập nhật các trường khác của mỗi phần tử trong quá trình trộn.

Cách đơn giản nhất là thêm tham số HS b[]HS c[] vào hàm trộn, và cập nhật các trường của mỗi phần tử trong hai mảng bc . Ví dụ:

void tron(HS a[], int l, int m, int r)
{
    HS b[m - l + 1];
    HS c[r - m];
    for (int i = 0; i < m - l + 1; i++)
    {
        b[i] = a[l + i];
    }
    for (int j = 0; j < r - m; j++)
    {
        c[j] = a[m + 1 + j];
    }
    int i = 0, j = 0, k = l;
    while (i < m - l + 1 && j < r - m)
    {
        if (b[i].ten <= c[j].ten)
        {
            a[k] = b[i];
            i++;
        }
        else
        {
            a[k] = c[j];
            j++;
        }
        k++;
    }
    while (i < m - l + 1)
    {
        a[k] = b[i];
        i++;
        k++;
    }
    while (j < r - m)
    {
        a[k] = c[j];
        j++;
        k++;
    }
}

Sau khi sửa đổi hàm trộn như trên, bạn có thể chạy lại chương trình và kiểm tra kết quả.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?