30/09/2018, 20:32

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	",a[i][j]);
		printf("
");
	}
}
//--------------------------------
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	",a[i]);
	printf("
");
}
//--------------------------------
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:
");
	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:
");
	xuatmang1chieu(b,nb);
	//Sap xep mang 1 chieu va in ket qua
	sapxepMang1Chieu(b,nb);
	printf("Mang 1 chieu sau khi sap:
");
	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:
");
	xuatmang(a,m,n); 
	//Sap xep mang 2 chieu truc tiep
/*	sapXepMang2Chieu(a,m,n);
	printf("Mang 2 chieu sau khi sap:
");
	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;
     }
}
nhatlonggunz viết 22:43 ngày 30/09/2018

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

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

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

Bài liên quan
0