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 ạ. ^^
Bài liên quan
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ậpl
?xem lại vòng for luôn, sao 2 vòng lại giống nhau?
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 ạ.
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
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 ạ.
khởi tạo
l=0
là đúng rồi, nhưng sao lại cấp phát khil=0
rồi mới nhậpl
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 , 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.