Hỏi về sắp xếp mảng trong C

Chào các a . E có thắc mắc trong sắp xếp mảng của code này mong các anh giải thích giùm e . E cảm ơn .

#include <stdio.h>
//--------------------------------
void nhapmang(int a[][50],int m, int n)
{
	int i,j;
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
		{
			printf("a[%d][%d]=",i,j);
			scanf("%d",&a[i][j]);
		}
}
//--------------------------------
void xuatmang(int a[][50],int m,int n)
{
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++) printf("%d\t",a[i][j]);
		printf("\n");
	}
}
//--------------------------------
void Chuyen2ChieuSang1Chieu(int a[][50],int m,int n,int b[],int &nb)
{
	int i,j;
	nb=0;
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
		{
			b[nb]=a[i][j];
			nb++;
		}
			
}
//--------------------------------
void xuatmang1chieu(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%d\t",a[i]);
	printf("\n");
}
//--------------------------------
void sapxepMang1Chieu(int a[],int n)
{
	int i,j,tam;
	for(i=0;i<n-1;i++)
		for(j=i+1;j<n;j++)
			if(a[j]<a[i])
			{
				tam=a[i];
				a[i]=a[j];
				a[j]=tam;
			}
}
//--------------------------------
void Chuyen1ChieuSang2Chieu(int a[][50],int m,int n,int b[],int nb)
{
	int i,j;
	nb=0;
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
		{
			a[i][j]=b[nb];
			nb++;
		}
}
//--------------------------------
void sapXepMang2Chieu(int a[][50],int m,int n)
{
	int i,j,k,l,tam;
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
		{
			k=i;l=j+1;
			if(l==n)
			{
				k++;
				l=0;
			}
			for(k;k<m;k++)
			{
				if(l==n) l=0;
				for(l;l<n;l++)
				{
					if(a[i][j]>a[k][l])
					{
						tam=a[i][j];
						a[i][j]=a[k][l];
						a[k][l]=tam;
					}
				}	
			}			
		}		
}
//--------------------------------
int main(int argc, char *argv[])
{
	int a[50][50],m,n,k,b[50],nb;
	//Nhap so dong va so cot
	printf("Nhap so dong: ");
	scanf("%d",&m);
	printf("Nhap so cot: ");
	scanf("%d",&n);
	//Nhap mang
	nhapmang(a,m,n);
	//Xuat mang
	printf("Mang vua nhap la:\n");
	xuatmang(a,m,n);
	//Chuyen tu mang 2 chieu sang 1 chieu
	Chuyen2ChieuSang1Chieu(a,m,n,b,nb);
	printf("Mang sau khi chuyen thanh 1 chieu:\n");
	xuatmang1chieu(b,nb);
	//Sap xep mang 1 chieu va in ket qua
	sapxepMang1Chieu(b,nb);
	printf("Mang 1 chieu sau khi sap:\n");
	xuatmang1chieu(b,nb);
	//Chuyen 1 chieu sang 2chieu va xuat mang 2 chieu
	Chuyen1ChieuSang2Chieu(a,m,n,b,nb);
	printf("Mang sau khi chuyen tu 1 chieu sang 2 chieu:\n");
	xuatmang(a,m,n); 
	//Sap xep mang 2 chieu truc tiep
/*	sapXepMang2Chieu(a,m,n);
	printf("Mang 2 chieu sau khi sap:\n");
	xuatmang(a,m,n); */
	return 0;
}

Cho e hỏi hàm sắp xếp mảng 1 chiều.Tại sao e dùng vòng lặp bên dưới lại sai ạ ?

for(int i=0;i<n;i++)
{
    if(a[i]<a[i+1])
    {
        int tam=a[i];
        a[i]=a[i+1];
        a[i+1]=tam;
     }
}

Vì đây không phải là thuật toán sắp xếp chuẩn nha bạn, thuật toán sắp xếp của bạn bị sai, bạn có thể tìm hiểu về các thuật toán sắp xếp:

  • Interchange Sort (dễ hiểu)
  • Quicksort (nâng cao hơn)

Hàm sapxepMang1Chieu của bạn mới là hàm đúng nha, thuật đó là Interchange Sort

à ra vậy . e cảm ơn .

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