PDA

View Full Version : مبتدی: مرتب سازی



Reza,M
جمعه 05 آبان 1391, 13:39 عصر
با سلام
اگه بخواهیم یک آرایه رو مثلا به روش حبابی مرتب کنیم خیلی ساده میتونیم مانند کد زیر انجام داد :


void sort(int arry[])
{
int i,j,temp;
for (i=0;i<n;i++)
for(j=0;j<n-i;j++)
if (arry[j]>arry[j+1])
{
temp=arry[j];
arry[j]=arry[j+1];
arry[j+1]=temp;
}
}

حال برای مرتب کردن یک ماتریس چطور باید عمل کرد ؟

Reza,M
جمعه 05 آبان 1391, 14:14 عصر
تا اونجا که میدونم اگه عناصر یک ماتریس را ابتدا ستونی و سپس سطری مرتب کنیم ماتریس مرتب میشه که برای ستونی دو forتودرتو و برای سطری نیز دو forتودرتو دیگه نیاز داریم
اما با این کار به جواب نمیرسم! ؟:اشتباه:
درنهایت میخوام مثلا اعداد 1تا9 به هرشکلی که وارد شدند به فرم زیر برسم :

مسعود اقدسی فام
جمعه 05 آبان 1391, 15:48 عصر
تا اونجا که میدونم اگه عناصر یک ماتریس را ابتدا ستونی و سپس سطری مرتب کنیم ماتریس مرتب میشه که برای ستونی دو forتودرتو و برای سطری نیز دو forتودرتو دیگه نیاز داریم
اما با این کار به جواب نمیرسم! ؟:اشتباه:
درنهایت میخوام مثلا اعداد 1تا9 به هرشکلی که وارد شدند به فرم زیر برسم :

تعریف ترتیب در فضای دو بعدی به مساله بستگی داره. این مثال شما در واقع مرتب‌سازی خطی آرایه هستش. در زبان ++C آرایه سه بعدی به صورت خطی در حافظه به همون ترتیبی که شما نوشتی ذخیره می‌شه. پس ۹ خانه رو به روش مرتب‌سازی یک بعدی مرتب کن تا به همین جواب برسی. درسته که آرایه مثلا [a[3][3 تعریف شده. اما a* تا (a+8)* عناصر تو هستن. مرتبشون کن.

Reza,M
جمعه 05 آبان 1391, 16:09 عصر
دوست عزیز میشه بیشتر توضیح بدین


پس ۹ خانه رو به روش مرتب‌سازی یک بعدی مرتب کن تا به همین جواب برسی

مسعود اقدسی فام
جمعه 05 آبان 1391, 16:34 عصر
کدی که نوشتید به جای [a[j‌ بنویسید (a+j)* و همینطور موارد مشابهش رو. یعنی با فرم اشاره‌گر کار کنید. حالا اگه یه آرایه arr با ابعاد سه در سه دارید همون کد رو بنویسید برای مرتب کردن آرایه به طول 9 و نه به طول 3. یعنی مثلا (arr + j)*

Reza,M
جمعه 05 آبان 1391, 16:40 عصر
جواب نگرفتم !!!


کدی که نوشتید به جای [a[j‌ بنویسید (a+j)* و همینطور موارد مشابهش رو. یعنی با فرم اشاره‌گر کار کنید. حالا اگه یه آرایه arr با ابعاد سه در سه دارید همون کد رو بنویسید برای مرتب کردن آرایه به طول 9 و نه به طول 3. یعنی مثلا (arr + j)*

اگه بجا استفاده از اشارگر از چند مرحله مرتب سازی برای اینکار استفاده کنیم چی؟

Reza,M
جمعه 05 آبان 1391, 21:45 عصر
دوستان نظری ندارند ؟؟؟؟

hoseinnn
شنبه 06 آبان 1391, 00:00 صبح
سلام
راحت تر این که شما اول اون ارایه 2 بعدی ( n بعدی ) رو به یک آرایه 1 بعدی تبدیل میکنی....بعد با همون روش حبابی مرتبش میکنی.....بعد از مرتب شدن دوباره تبدیلش میکنی به آرایه n بعدی اولیه!

مسعود اقدسی فام
شنبه 06 آبان 1391, 00:05 صبح
جواب نگرفتم !!!

اگه بجا استفاده از اشارگر از چند مرحله مرتب سازی برای اینکار استفاده کنیم چی؟

وقت ندارم کد بنویسم که ببینید می‌شه جواب گرفت. این روشی که دوستمون گفتن دو بعدی رو یه بعدی کنید همون کاریه که من گفتم. فقط بدون تبدیل.

hoseinnn
شنبه 06 آبان 1391, 13:09 عصر
البته منم اشاره گر رو تو C ترجیح میدم ، به هر حال بدون استفاده از اشاره گر برای دسترسی به عناصر آرایه 2 بعدی میشه این طوری نوشت:( ارایه n*n)
a[j/n][j%n]
متغیر j هم از 0 تا n*n مقدار میگیره...
مرتب سازی آرایه 3*3 به روش حبابی رو میشه این طوری نوشت :
//******************* sorting array a[3][3]
for(i=0;i<8;i++) // i<9-1
for(j=0;j<8;j++)
if(a[(j+1)/3][(j+1)%3]<a[j/3][j%3])
{
temp=a[(j+1)/3][(j+1)%3];
a[(j+1)/3][(j+1)%3]=a[j/3][j%3];
a[j/3][j%3]=temp;
}
دقیقا مثل یک آرایه یک بعدی! همون چیزی که دوستمون گفتن البته بدون اشاره گر.

Reza,M
یک شنبه 07 آبان 1391, 14:21 عصر
ضمن تشکر از دو دوست عزیز. منظورم از چند مرحله مرتب سازی اینگونه بود

void Sort(int matrix[4][4])
{
for (int k=0; k<4; k++)
for (int i=0; i<3; i++)
for (int j=0; j<3-i; j++)
{
if (matrix[k][j]>matrix[k][j+1])
{
int temp=matrix[k][j];
matrix[k][j]=matrix[k][j+1];
matrix[k][j+1]=temp;
}
for (int k=0; k<4; k++)
for (int i=0; i<3; i++)
for (int j=0; j<3-i; j++)
{
if (matrix[j][k]>matrix[j+1][k])
{
int temp=matrix[j][k];
matrix[j][k]=matrix[j+1][k];
matrix[j+1][k]=temp;
}
}
}
}

T.R.G.T
پنج شنبه 10 اسفند 1391, 18:36 عصر
تو php من برای مرتب کردن آرایه چند بعدی با ابعاد نامشخص از یک تابع بازگشتی استفاده کردم