PDA

View Full Version : مرتب سازی ویژه



sa1378
دوشنبه 13 مرداد 1393, 18:43 عصر
سلام
میخوایم یه استراکت به صورت آرایه داشته باشیم که توش مثلا سه تا int به نام های a ,b,c باشه
حالا میخوایم این متغیر هارو از ورودی بگیریم
بعد به ترتیب مقدار متغییر a استراکت هارو مرتب کن(اون که بیشتره بیاد جلو)
اگه دو تا استراکت a هاشون برابر بود اونی که مقدار b کمتری داره جلوتر باشه
اگه B هم برابر بود اونی که c بیشتری داره بیاد جلوتر

اگه استراکت نبود هم اشکال نداره

amirtork
دوشنبه 13 مرداد 1393, 20:06 عصر
سلام
خب برای این سوال میشه از راه های مختلفی استفاده کرد! بستگی داره از این کد کجا میخواید استفاده کنید، اگر Order براتون مهم هست، باید از الگوریتم های سورت با Order پایین تر، مثل سورت انتخابی یا quick sort استفاده کنید، البته همراه با یک سری تغییرات در شروط اونها که بتونن تساوی بین متغیر ها رو هم تشخیص بدن و برنامه رو به سمت مناسب هدایت کنن، راحت ترین روش پیاده سازی هم که استفاده از مرتب سازی حبابی هست به علاوه ی یک شرط برای حالت تساوی.
اگر لازم هست بگید تا درمورد نوشتن کدش هم توضیحاتی رو بدم، هرچند استادان بزرگی هستن که قطعا بهتر از من میتونن شما رو راهنمایی کنن.

sa1378
دوشنبه 13 مرداد 1393, 22:23 عصر
روشی بجز اینکه اول سورت کنیم(حالا با هرچی مثلا تابع sort) و بعد بیایم برای همه شرط تساوی رو بررسی کنیم وجود نداره؟
آخه مثلا وقتی یه pair رو به صورت میدی خودش اینکارو میکنه
ولی اینجا میخوایم هر متغییر یه نوع مرتب بشه(نزولی و صعودی بودن)

rahnema1
دوشنبه 20 مرداد 1393, 22:55 عصر
سلام این جور میشه انجام داد
البته یک راه بهتر اینه که داخل استراکت به جای a , b ,c یک آرایه 3 تایی تعریف کنیم که بعدا هم میشه به n تایی تبدیل کرد

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct ABC{
int a,b,c;
};
bool lower( const ABC& x,const ABC& y)
{
if(x.a!=y.a)
return x.a <y.a;
if(x.b!=y.b)
return x.b <y.b;
return x.c<y.c;
}
int main()
{
vector<ABC> abc({{1,5,3}
,{1,2,9}
,{7,2,6}
,{1,5,2}});
sort (abc.begin(),abc.end(),lower);
for (ABC aa: abc)
cout<<aa.a<<","<<aa.b<<","<<aa.c<<endl;
}

a.r.khoshghalb
سه شنبه 21 مرداد 1393, 04:28 صبح
تعریف کردن تابع مقایسه هم یک راه خوب است ولی همیشه جواب نمی دهد مثل مواقعی که می خواهیم درون یک ست بریزیم.
بهترین کار تعریف کردن اپراتور کوچک تر برای استراکت است.
اگر اپراتور کوچک تر تعریف کنیم، می توانیم مقایسه انجام دهیم
مثلا :

ABC a;
ABC b;
if (a < b)
//Code hayii ke mikhay...

و حال که مقایسه داریم، می توانید از تابع سورت، ریختن توی مپ یا ست، باینری سرچ و تمام تابع های دیگر که بر اساس مقایسه هستند استفاده کنید.
کد تعریف اپراتور کوچک تر:

#include <iostream>
#include <set>

using namespace std;

struct ABC{
int a,b,c;
bool operator < (const ABC k) const
{
if (a < k.a)
return true;
if (a > k.a)
return false;
if (b < k.b)
return true;
if (b > k.b)
return false;
if (c < k.c)
return true;
if (c > k.c)
return false;

return true;
}
};

int main()
{
int n;
cin >> n; //Tedade voroodi
set<ABC> s; //Set ii ke Struct ha ro toosh negah midari
for (int i = 0; i < n; i++)
{
ABC x;
cin >> x.a >> x.b >> x.c;
s.insert(x);
}
}

omid_kma
سه شنبه 21 مرداد 1393, 13:00 عصر
با استفاده از لامبدا هم این کار قابل انجامه مرتب کردن آرایه از کلاس (http://www.7khatcode.com/index.php?qa=1221&qa_1=%D9%85%D8%B1%D8%AA%D8%A8-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B2-%DA%A9%D9%84%D8%A7%D8%B3-%D8%A8%D8%A7-std-sort)