Giúp lỗi bài toán quy hoạch động

Mọi người giúp e bài này với ạ, e viết bị lỗi ! Sắp xếp merge sort theo quy hoạch động. E viết theo giải thuật sắp xếp hai đường trực tiếp!

#include <iostream>

using namespace std;
void xuat( int a[], int n)
{
	int i;
	for(i = 0; i <n; i++)
	{
		cout<<" "<<a[i];
	}
}

int MERGE(int A[], int r, int LBA,int B[], int s, int LBB, int C[], int LBC )
{
	//1.
	int i = LBA;
	int j = LBB;
	int k = LBC;
	int UBA = LBA + r -1;
	int UBB = LBB + s -1;
	//2.
//	cout<<"test";
	while( i <=UBA && j <=UBB)
	{
	//3. 
	    if( A[i] < A[j])
		{
		  C[k]	= A[i];
		  i++;
		  k++;
		}
		else
		{
			C[k] = B[j];
			j++;
			k++;
		}	
		
	}
	//5.
	if( i>UBA)
	{
		for (int t = 0; t <= UBB-j;t++)
		{
			C[k+t] = B[j+t];
		}
	}
	else
	{
		for (int t = 0; t <= UBA-i;t++) 
		{
			C[k+t] = A[i+t];
		}
	}
//	cout<<C[k];
}

int MPASS (int K[],int n, int l, int X[])
{
	//1.
	int Q = n/(2*l); 
//	cout<<"Q= "<<Q<<endl;
	int S = 2*l*Q;
//	cout<<"S= "<<S<<endl;
	int R = n - S;
//	cout<<"R= "<<R<<endl;

	//2. 
	for ( int j =1; j <=Q; j++)
	{
		int LB = 1+( 2*j -2) * l;
//		cout<<" "<<LB;
		MERGE(K,1,LB,K,1,LB+1,X,LB);
//		xuat(K,n);
//		cout<<endl;
	}

	//3.
	if(R <=l)
	{
		for ( int j =1; j <=R; j++) 
		{
		X[S+j] = K[S+j];
//		cout<<X[j];
		}

	}

	//4.
	else MERGE(K,1,S+1,K,R-l,1+S+1,X,S+l);

}
int STRAIGHT_SORT(int K[], int n)
{
	int l=1 ; int X[50];
	while ( l <n )
	{
		MPASS(K,n,l,X);
		MPASS(X,n,2*l,K);
		l = 4*l;
	}
}
int main()
{
	int l;int n = 10;
	int C[10],X[10];
	int K[10] = {42,23,74,11,65,58,94,36,99,87};
	cout<<"day ban dau: ";
	xuat(K,n);
	cout<<endl;
//	MPASS(K,n,l,X);
	STRAIGHT_SORT(K,n);
	cout<<"day sau khi sap xep: ";
	xuat(K,n);
	
}

Mình không phải expert nên mình chỉ để lại vài điểm mình thấy bất ổn, hy vọng là bạn tìm được lời giải.

  1. Trong hàm MERGE, bạn khai các tham số R và S để thể hiện kích thước của mảng A và B, nhưng bạn lại không sử dụng nó ở bất cứ đâu trong hàm, nên loại bỏ tham số R và S thay thế chúng bằng các biến UBA và UBB.
  2. Trong hàm MPASS, bạn sử dụng biến L để biểu thị đồ dài nhưng bạn ko cho nó giá trị nào, có thể gây ra một lỗi ngẫu nhiên nào đó, tốt nhất là nên gán giá trị cho nó khi sử dụng.
  3. Vẫn là hàm MPASS, bạn dùng vòng lặp for để sắp xếp các nguyên tố trong chuỗi K nhưng lại sử dụng giá trị của biến ‘j’, điều này có thể khiến cho vòng lặp chạy sai số lần hoặc truy cập phần tử nằm ngoài giới hạn.
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?