Nhập tên địa chỉ, sắp xếp tên theo alphabet, in ra danh sách tên+địa chỉ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct info
{
    char fname[20]; 
    char adr[30];
    char lname[20];
};
void input(info a[],int n) 
{
     for (int i = 0; i < n; i++) 
    {
        printf("infomation of %d person :\n", i + 1);
        printf("first name: "); fflush(stdin); //nhap ten
        gets(a[i].fname);
        printf("last name: ");//nhap ho,ten dem
        gets(a[i].lname);
        printf("address: "); fflush(stdin);
        gets(a[i].adr);
    } 
}
void compare(info a[],int n)
{
 	int i,j;
 	char k,l;
     for( i=0;i<n-1;i++)
     {
     	for( j=i+1;j<n;j++)
     	if(strcmp(a[i].fname,a[j].fname)>=0)
    	{
    	 	if( strcmp(a[i].fname,a[j].fname)>0)
    	 	{
    		 	 info k=a[i];
    		 	a[i]=a[j];
    		 	a[j]=k;
		 	}
		 	else
	 		{
		 	if(strcmp(a[i].lname,a[j].lname)>0)
			 	{
			 	info	l=a[i];
    		 	a[i]=a[j];
    		 	a[j]=l;
	 		 	}
 			}
 		}
 	}
} 
void output(info a[],int n)
{
 	for(int i=0;i<n;i++)
		{
			printf("\n%s %s",a[i].lname,a[i].fname);
			printf("\n%s",a[i].adr);
		}
}
int main()
{
	int n;
	printf("numbers of people:");				
 	scanf("%d",&n);
	info a[100];
	input(a,n);
	compare(a,n);
	output(a,n);	
}
int main()
{
	int n; // chỗ này e chưa nhập n
	info a[100];
	input(a, n);
	compare(a,n);
	output(a,n);
	getch();
}

ủa sao cuối mấy này lại có dấu “;” nhỉ?
Lâu rồi không động tới c nên quên mất rồi, nhìn lạ lạ

1 Like

hàm compare ổng đó viết thừa đó :)) với lại chưa tối ưu lắm

1 Like

Đây là hàm sắp xếp quickSort() của người ta làm.
Bạn thử tham khảo coi (Tôi chưa test)
Tôi đã đổi hàm compare(a,n); của bạn thành hàm quickSort(info a[],int left, int right)

quickSort()
void quickSort(info a[],int left, int right)
{
	if (a == null || a.length <= 0){ //Không biết chỗ này có error không nữa
		return;
	}
	if (left >= right) {
			return;
	}
 	int i = left, j = right;
	int middle = left + (right - left)/2;
	int pivot =  a[middle];
	while (i<=j) {
		while (strcmp(a[i].lname, pivot.lname)<0) ++i;
		while (strcmp(a[j].lname, pivot.lname)>0) --j;
		if (i<=j) {
			int temp = a[i];
			a[i] = a[j];
			a[j] = temp;
			++i;
			--j;
		}
	}
	if (left < j) quickSort(a, left, j);
	if (i < right) quickSort(a, i, right);
} 

Hàm main() gọi hàm quickSort(a, 0, n -1);

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