30/09/2018, 16:14

Xin trợ giúp tìm kiếm nhị phân cho mảng 2 chiều từ mọi người

Tình hình là sau khi học thuật toán tìm kiếm nhị phân ( binary search ). Sau đó bắt tay vào test với mảng 2 chiều. Vẽ mảng 2 chiều ra và làm thử như mảng 1 chiều thì lại ko đc bởi số lượng phần tử nếu sắp xếp tăng dần thì gặp tình trạng giới hạn bởi dòng và cột chứ ko 1 mạch như mảng 1 chiều nên sẽ gặp phải hiện tượng tràn số nếu đặt giá trị mảng khai báo nhỏ hoặc sẽ thành giá trị rác nếu như khai báo lớn. Sau đó bản thân mình nghĩ sẽ sắp xếp tăng dần theo dòng hoặc cột sẽ tốt hơn. Thao tác của mình là chạy dòng nào cần sắp xếp tăng dần. Sau khi sắp xếp xong và gán giá trị sang mang mới lại gặp tình trạng báo lỗi ko biết giải quyết sao. Mong mọi người xem xét giúp đỡ. @Is2IT @ltd @tuancoi2506 . chỉ cần cho em xin cách giải thôi là okje!
code :

#include <iostream>
using namespace std;
#define MAX 300
void nhapMang2Chieu(int [][MAX], int, int);
void xuatMang2Chieu(int [][MAX], int , int );
void hoanVi(int &, int &);
void sapXepMang2ChieuTangDanChoDong(int [][MAX], int, int, int [], int &);
void nhapMang2Chieu(int a[][MAX], int dong, int cot)
{
	for (int i = 0; i < dong; ++i)
	{
		for (int j = 0; j<cot; ++j)
		{
			cout << "Moi ban nhap gia tri cho mang[" << i << "]" << " [" << j << "]:";
			cin >> a[i][j];
		}
	}
}

void xuatMang2Chieu(int a[][MAX], int dong, int cot)
{
	for (int i = 0; i < dong; ++i)
	{
		for (int j = 0; j < cot; ++j)
		{
			cout << " " << a[i][j] << " ";
		}
		cout << endl;
	}
}
void hoanVi(int &x, int &y)
{
	int temp = x;
	x = y;
	y = temp;
}
void sapXepMang2ChieuTangDanChoDong(int a[][MAX], int dongx, int cot,int b[],int &phanTu)
{
	phanTu = 0;
	for (int i = dongx; i >= dongx; --i)
	{
		for (int j = 0; j < cot; ++j)
		{
			if (a[dongx][j]>a[dongx][j + 1])
			{
				hoanVi(a[dongx][j], a[dongx][j]);
			}
		}
	}
	for (int i = dongx; i >= dongx; --i)
	{
		for (int j = 0; j < cot; ++j)
		{
			b[phanTu] = a[dongx][j];
			phanTu++;
		}
	}
	for (int i = 0; i < phanTu; ++i)
	{
		cout << " " << b[i] << " ";
	}
}
int main(int argc, char **argv)
{
	int a[MAX][MAX], dong, cot;
	do 
	{
		cout << "Moi ban nhap so dong cua mang 2 chieu : ";
		cin >> dong;
		if (dong<0 || dong>MAX)
		{
			cout << "
So dong ban nhap ko hop le. xin kiem tra lai!!";
		}
	} while (dong<0||dong>MAX);
	do
	{
		cout << "Moi ban nhap so cot cua mang 2 chieu : ";
		cin >> cot;
		if (cot<0 || cot>MAX)
		{
			cout << "
So cot ban nhap ko hop le. xin kiem tra lai!!";
		}
	} while (cot<0 || cot>MAX);

	nhapMang2Chieu(a, dong, cot);
	xuatMang2Chieu(a, dong, cot);

	int dongX;
	do 
	{
		cout << "
Nhap so dong ban mun sap xep tang dan: ";
		cin >> dongX;
		if (0 > dongX || dongX > dong)
		{
			cout << "
DOng ban mun sap xep ko ton tai. vui long kiem tra lai!!";
		}
	} while (0>dongX || dongX>dong);
	
	sapXepMang2ChieuTangDanChoDong(a, dongX, cot);
	system("pause");
	return 0;
}
Quân viết 18:23 ngày 30/09/2018

Ý là sao nhỉ, đọc 3 lượt vẫn thấy lơ tơ mơ…
Có phải mắc ở đoạn mà đối mảng 2 chiều trong hàm phải có số lượng cột?
Nếu đúng thì học cách dùng con trỏ nhé.

Thực tế khắc nghiệt viết 18:23 ngày 30/09/2018

ý mình là tìm kiếm dùng binary search với mảng 2 chiều đó anh. Mình tính là tìm từng dòng hoặc cột vì thế phải sắp xếp tăng dần hay giảm dần nhưng mà nó sai. Quân có thể nói hoàn thiện các bước để tìm kiếm trong mảng 2 chiều ko? với binary search đó cảm ơn nhé

Quân viết 18:29 ngày 30/09/2018

nhưng vấn đề là khi sắp xếp trong từng hàng, từng cột tại sao lại lỗi?

viết 18:22 ngày 30/09/2018

Sắp xếp mảng 2 chiều thì có thể chuyển mảng 2 chiều về mảng 1 chiều để sort, sau đó cho nó vào lại mảng 2 chiều. Có thể truy cập phần tử a[i][j] của mảng 2 chiều giống mảng 1 chiều bằng cách dùng con trỏ.
a[i][j] = *( a + i * m + j ) với m là số cột của ma trận.

X viết 18:18 ngày 30/09/2018

mình nghĩ cũng như mảng 1 chiều có: đầu + giữa + cuối
thì mảng 2 chiều có : dòng đầu/cột đầu + dòng giữa/cột giữa + dòng cuối/cột cuối
:)))))

Thực tế khắc nghiệt viết 18:20 ngày 30/09/2018

hoá ra là tách mảng sau đó sort xong rồi đẩy về. thế mà cứ nghĩ là sort được trong cái mảng 2 chiều rồi tách ra cơ chứ. cảm ơn ae

Bài liên quan
0