Code tim kiếm phần tử của mảng bị sai kết quả

#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 ạ

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