Sắp xếp mảng tăng dần

#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAX 100

void nhap (int a[], int &n)
{
	do
	{
		printf("\nNhap so phan tu: ");
		scanf("%d", &n);
		if(n <= 0 || n > MAX)
		{
			printf("\nSo phan tu khong hop le. Xin kiem tra lai !");
		}
	}while(n <= 0 || n > MAX);
	for(int i = 0; i < n; i++)
	{
		printf("\nNhap a[%d]: ", i);
		scanf("%d", &a[i]);
	}
}

void xuat(int a[], int n)
{
	for(int i = 0; i < n; i++)
	{
		printf("%4d", a[i]);
	}
	printf("\n");
}

void hoanvi(int c,int d)
{
	int temp;
	c=temp;
	c=d;
	d=temp;
}

void sapxeptangdan(int a[],int n)
{
	int i,j;
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[i]>a[j])
				hoanvi(a[i],a[j]);
		}
	}
	//Xuat
	for(j=0;j<n;j++)
	{
		printf("%4d",a[j]);
	}
}

int main()
{
	int n;
	int a[MAX];
	nhap(a, n);
	xuat(a, n);
	sapxeptangdan(a, n);
	getch();
	return 0;
}

Mình làm không ra

Anh nhìn vào đã thấy sai.
Hình như em không chịu chạy debug thì phải.

3 Likes

Hàm hoán vị của bạn sai rồi.

1 Like

góp ý là sau khi bản sửa lại hàm hoán vị cho đúng như mấy bạn ở trên nói nếu mà không ra nữa thì khuyên bạn hãy dùng con trỏ :smile:

Hoán vị giá trị thì thua rồi,
1 là trức tiếp trong hàm sắp xếp.
2 dùng con trỏ, tham chiếu đi.

1 Like

Cho mình hỏi một tẹo được k ? :smiley: nếu bạn viết thế này tức là xét điều kiện của n, nếu n>MAX hoặc n<0 thì bắt đầu nhập giá trị cho các phần tử trong mảng à !?!?
À mà mình nghĩ bạn làm hoán vị kiểu này thì mình nghĩ sẽ k ra được đâu, vì khi bạn hoán vị thì ở đây của bạn chỉ hoán vị giá trị trong hàm hoán vị đó thôi, cụ thể ở đây bạn hoán vị cho biến trung gian là temp, nhưng vì bạn khai báo biến temp đó trong hàm hoán vị nên ra khỏi hàm đó biến temp sẽ biến mất,(biến cục bộ mà) , tất cả các biến được khai báo trong hàm main trước lời gọi hàm và sau lời gọi hàm là k thay đổi, … mà nói chung là dùng con trỏ đi, bạn hiểu ý mình chứ ? :wink:

không bạn , nếu n>MAX và n<0 thì cứ là cái dòng ở trên là bắt nhập lại

thanks bạn tại lúc đó chưa học đến con trỏ nên k hiểu bản chất,giờ thì mình hiểu rồi.

À à r xin lỗi bạn, mình k nhìn thấy dấu chấm phẩy ở lệnh while nên hiểu nhầm :smile:

cho mình hỏi là tại sao mình lai cho j=i+1 mà không cho một giá trị khác bất kì hay là j=0 chăng hạn

cho j = i+1 là vì mình sẽ chọn 1 số thích hợp (lớn nhất hoặc nhỏ nhất tùy yêu cầu sắp xếp, trường hợp này thì là số nhỏ nhất) trong các số chưa sắp xếp (từ i đến n-1) để đưa lên vị trí i.
(từ 0 đến i-1 là các phần tử đã ở đúng vị trí của nó rồi).

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