30/09/2018, 20:37

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 )

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 ạ. ^^

Củ Chuối viết 22:46 ngày 30/09/2018

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ỉ?

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

int l=0;
int *ptrmang=new int[l];
cout<<“Nhap so phan tu cua mang”;
cin>>l;

Đ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 ?

int trunggian=0;
for(int j=0;j<t;j++)
{
for(int i=0;i<t;i++)
{

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

Lê Trọng Nghĩa viết 22:37 ngày 30/09/2018

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

Lê Trọng Nghĩa viết 22:48 ngày 30/09/2018

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 ạ.

Củ Chuối viết 22:53 ngày 30/09/2018
`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

Lê Trọng Nghĩa viết 22:41 ngày 30/09/2018

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.

Lê Trọng Nghĩa viết 22:38 ngày 30/09/2018

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

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

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.

Lê Trọng Nghĩa viết 22:47 ngày 30/09/2018

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 ạ.

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

Đâu ổn đâu bạn , 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.

Bài liên quan
0