Thắc mắc về code sắp xếp các phần tử trong mảng

Chào mọi người, em là lính mới, đang chân ướt chân ráo học lập trình ạ.
Em có viết thử đoạn code dưới đây, với chức năng là: nhập vào một mảng với số phần tử được khai báo trước, chương trình sẽ sắp xếp lại các phần tử của mảng đó theo thứ tự tăng dần.

#include <iostream>

using namespace std;
void nhapmamg(int arr[],int n)
{

    cout<<"xin moi nhap mang"<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
};

void xuatmang(int lol[],int k)
{
    for(int i=0;i<k;i++)
    {
        cout<<lol[i]<<endl;
    }
};

void sapxepmang(int sx[],int t)
{
    int trunggian=0;
   for(int j=0;j<t;j++)
   {
    for(int i=0;i<t;i++)
    {
        trunggian=0;
        if(sx[i]>sx[i+1])
        {
            trunggian=sx[i+1];
            sx[i+1]=sx[i];
            sx[i]=trunggian;

        }
    }
    }
}
int main()
{
    int l=0;
    int *ptrmang=new int[l];
    cout<<"Nhap so phan tu cua mang";
    cin>>l;
    nhapmamg(ptrmang,l);
    sapxepmang(ptrmang,l);
    xuatmang(ptrmang,l);
    delete[] ptrmang;
    return 0;
}

Khi em chạy thử thì lại ra kết quả lạ như sau (gần đúng rồi, không hiểu sao lai thế này :joy:)

Vậy là thế nào ạ? Mọi người có thể giải thích cho em được không? Em xin cảm ơn ạ. ^^

nếu nhìn code, có cả for j và for i, mình nghĩ code của bạn theo thuật toán : xét 1 phần tử nếu lớn hơn các phần tử tiếp sau nó thì sẽ thực hiện swap. Phải ko nhỉ?

Đoạn này bạn xem lại, sao lại cấp phát với l=0 rồi mới nhập l ?

xem lại vòng for luôn, sao 2 vòng lại giống nhau?

1 Like

Dạ chính xác rồi ạ. Nhưng không hiểu sao ra giá trị rác.

Phải có hai vòng: vòng thứ nhất để so sánh tìm ra số lớn nhất đẩy nó lên trên cùng, rồi số lớn nhì, số lớn thứ ba, lần lượt đẩy về vị trí thích hợp nên cần cái vòng thứ hai ạ.

`for(int j=0;j<t;j++)
   {
    for(int i=j+1;i<t;i++)
    {
        trunggian=0;
        if(sx[j]>sx[i])
        {
            trunggian=sx[j];
            sx[j]=sx[i];
            sx[i]=trunggian;

        }
    }
    }`

nếu vậy thì phải sửa 2 vòng for trên, để nó liên quan tới nhau mới đc, cái sắp xếp bạn dùng gọi là Sắp xếp chọn (sr Nhầm với Sắp xếp nổi bọt)
Thêm 1 lưu ý là cái dòng sx[i+1] khi i=t-1 thì sx[i+1] sẽ ra 1 giá trị ngẫu nhiên ko có trong mảng, vì chỉ số mảng bị vượt, nên nó ra số -214…8

1 Like

Việc cấp phát l=0 trước là vì em sợ bị giá trị rác. Nhưng thực tế nếu chỉ nhập và xuất mảng thì không sao hết nên em không nghĩ phần đó bị lỗi.

A hiểu rồi. Cảm ơn ạ. :smiley:

1 Like

khởi tạo l=0 là đúng rồi, nhưng sao lại cấp phát khi l=0 rồi mới nhập l vào? nếu làm như bạn thì code có nghĩa là int *a=new int[0], tức là cấp phát mảng 0 phần tử, trị rác là do cái này ra.

Em thấy anh nói cũng đúng, nhưng khi khởi chạy thì vẫn ổn ạ. Còn giá trị rác thì như anh củ chuối đã giải thích ạ.

Đâu ổn đâu bạn :smile:, khi cấp phát mảng 0 phần tử với new thì không sai, nhưng khi sử dụng vùng nhớ này sẽ gây undefined behavior ví dụ làm chương trình của bạn sẽ bị crash chẳng hạn.

1 Like

Làm như vầy cho dễ nè

#include<iostream>
using namespace std;
int main()
{
	int A[10000], trunggian;
	cout << "nhap vao may so phan tu ";
	int n; cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cout << "gia tri cua mang  " << i << "= "; cin >> A[i];
		for (int j = i + 1; j <= n; j++)
		{
			if (A[i] > A[j])
			{
				s = A[i];
				A[i] = A[j];
				A[j] = s;
			}
		}
	}
	for (int i = 1; i <= n;i++)
	{
		for (int j = i + 1; j <= n; j++)
		{
			if (A[i] < A[j])
			{
				trunggian = A[i];
				A[i] = A[j];
				A[j] = trunggian;
			}
		}
	}
	for (int i = 1; i <= n; i++)
	{
			cout  << A[i] << endl;
	}
	system("pause");
	return 0;
}

Code như bạn sai logic rồi. Ai lại vừa đọc vừa sort bao giờ. Mảng đã đọc hết đâu mà sort từ 1 đến n thành công?

1 Like

Vừa đọc vừa sort cũng có, sử dụng kết hợp với insert sort rất ok, ngay khi vừa load data lên RAM là đã được dãy sắp xếp.

1 Like

Nhưng đây là đọc a[i] rồi sắp xếp trên đoạn a[i+1 -> n] thì có nghĩa lý gì đâu anh?

2 Likes

Thì tư tưởng cũng được, nhưng cách làm thì sai :joy:

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