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;
}
}
Bài liên quan
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:
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 .