#include<iostream>
using namespace std;
//Ham nhap ma tran
void nhap( int **a, int length )
{
cout<<"nhap du lieu cho ma tran: ";
for (int i = 0; i < length; i++)
for(int j = 0; j < length; j++)
{
cout << "a[" << i << "][" << j << "] :";
cin >> a[i][j] ;
}
}
//Ham xuat ma tran
void xuat(int **a, int length)
{
cout << "xuat du lieu cho ma tran: \n";
for (int i = 0; i < length; i++)
{
for(int j = 0; j < length; j++)
{
cout << a[i][j] << "\t";
}
cout << "\n" ;
}
}
//Xuat mang mot chieu
void XuatMang(int x[],int length)
{
for(int i = 0; i < length; i++)
{
cout << x[i] <<" ";
}
}
//Ham chon mang de xu ly
void ChonMang(int *A,int **a,int length)
{
int row;
do
{
cout << "\nChon mang de xu ly : ";
cin >> row;
if ( row < 0 || row >= length)
{
printf ("<Mang ko hop le, can nhap lai> ");
}
}while ( row < 0 || row >= length);
for (int j = 0; j < length; j++)
{
A[j] = a[row][j];
}
}
//sap xep tang dan
void radixSort1(int *a, int length)
{
int i, m = 0, exp = 1, b[100];
for (i=0; i<length; i++)
{
if (a[i] > m)
m = a[i];
}
while ( m / exp > 0 )
{
int bucket[10] = {0};
for (i = 0; i < length; i++)
bucket[ a[i] / exp % 10 ]++;
for (i = 1; i < 10; i++)
bucket[i] += bucket[i-1];
for (i = length-1; i >= 0; i--)
b[--bucket [a[i] / exp%10] ] = a[i];
for (i=0; i < length; i++){
a[i] = b[i];
}
exp *= 10;
}
}
//sap xep giam dan
void radixSort2 (int *a, int length){
int i, m = 0, exp = 1, b[100];
for (i = 0; i < length; i++)
if (a[i] > m)
m = a[i];
while ( m/exp > 0)
{
int bucket[10] = {0};
for (i = 0; i < length; i++)
bucket[9 - a[i] / exp % 10]++; // changed this line
for (i = 1; i < 10; i++)
bucket[ i ] += bucket[i-1];
for (i = length-1; i >= 0; i--)
b[--bucket[ 9-a[i]/exp%10] ] = a[i]; // changed this line
for (i=0; i<length; i++)
{
a[i] = b[i];
}
exp *= 10;
}
}
//Sap xep phan tu
void sapxep(int *A, int **a, int length )
{
cout << ("\n\n<Sap xep phan tu cua mang>");
ChonMang(A, a, length);
cout << "Truoc khi sort: ";
XuatMang(A, length);
cout << "\nSau khi sort ";
cout << "\n-Sap xep tang dan: ";
radixSort1(A, length);
XuatMang(A, length);
cout << "\n-Sap xep giam dan : ";
radixSort2(A, length);
XuatMang(A, length);
}
bool ascending(int left, int right)
{
return left < right;
}
bool ascending1(int x, int y)
{
return x > y;
}
bool descending(int left, int right)
{
return left > right;
}
bool descending1(int x, int y)
{
return x < y;
}
//Tim kiem nhi phan
void binarySearch(int *A, int **a, int length,int left,int right,bool (*comp1) (int ,int),bool (*comp2) (int, int))
{
int mid, key;
cout<<"Nhap gia tri can tim : ";
cin >> key;
while( comp1(left,right ) )
{
mid = (left + right) / 2;
if(A[mid] == key)
break;
else if( comp2( A[mid], key ) )
right = mid - 1;
else
left = mid + 1;
}
if (A[mid] == key)
{
cout << "a["<<mid <<"] = " << key;
}
else
{
cout<<"\nKhong tim thay phan tu"<<endl;
}
}
int main(){
int n,val;
int *A=new int[n];
do
{
cout<<"Nhap cap cua ma tran: ";
cin>>n;
if(n<3||n>10)printf("Nhap cap n cua ma tran voi 3 <= n <= 10 \n");
}while(n<3||n>10);
int **a = new int*[n];
for(int i = 0; i<n; i++)
a[i] = new int[n];
nhap(a,n);
xuat(a,n);
cout << "\n\n < Tim kiem nhi phan(Binary search) >";
ChonMang(A, a, n);
cout << "De tim kiem, hay sap xep mang truoc";
int chon;
cout << "\n1.Sap xep tang dan \n2.Sap xep giam dan \n Ban chon: ?";
cin >> chon;
if (chon == 1)
{
radixSort1(A,n);
cout << "after sort: ";
XuatMang(A,n);
binarySearch(A, a, n, 0, n-1, ascending, ascending1);
}
if (chon == 2)
{
radixSort2(A,n);
cout << "after sort: ";
XuatMang(A,n);
binarySearch(A, a, n, 0, n-1, descending, descending1);
}
for(int i = 0; i<n; i++)
{
delete []a[i];
}
delete []a;
return 0;
}
Đề bài là tìm kiếm phần tử từ mảng X của ma trận vuông cấp m bằng phương pháp binary search(nếu tìm thấy, in ra vị trí và giá trị phần tử tìm được: A[i] = …)
và đây là kết quả khi e chạy code
Kết quả đúng phải là a[2] = 7 ,mong mấy tiền bối giúp em chỗ này với ạ