تالار گفتمان مانشت
heapsort - نسخه‌ی قابل چاپ

heapsort - mhd3 - 02 دى ۱۳۹۲ ۰۷:۳۸ ب.ظ

سلام.
به منظور سورت صعودی یک ارایه از هیپ سورت استفاده نموده و ماکس هیپ میسازیم. در مورد زمان اجرا این الگوریتم کدام گزینه صحیح است؟؟
۱- اگر آرایه از ابتدا به صورت صعودی مرتب باشد زمان مورد نیاز ( O(n است.
۲- اگر آرایه از ابتدا به صورت نزولی مرتب باشد زمان مورد نیاز ( O(n است.
۳- اگر آرایه از ابتدا به صورت نزولی مرتب باشد زمان مورد نیاز n^2logn است.
۴- اگر آرایه از ابتدا به صورت صعودی مرتب باشد زمان مورد نیاز nlogn است.

--سوال اولم اینه که مگه برای مرتب کردن صعودی از مین هیپ استفاده نمیکردیم؟؟ چرا اینجا گفته ماکس هیپ؟!
--سوال دومم هم اینه که چرا گزینه ۲ درست نیست؟ گزینه ۴ رو میدونم درسته...

واسه گزینه ۲:
در حالت عادی میدونیم که وقتی در هیپ درج میکنیم باید تا جای ممکن با پدرش تعویض کنیم تا هیپ باقی بمونه. هزینه درج ۱ و هزینه مرتب کردن logn میشه و هزینه n بار درج (و در صورت نیاز جابجایی برای مرتب کردن) میشه nlogn
اما اینجا
میدونیم که یک آرایه نزولی، یک ماکس هیپه. خوب وقتی از اول مرتب شده رو داریم فقط کافیه هزینه درج رو بپردازیم نه هزینه مرتب کردن رو. که هزینه درج هر عنصر از یک آرایه مرتب نزولی در یک ماکس هیپ هم میشه( O(1
و برای درج n تا عنصر میشه ( O(n
درسته؟؟

RE: heapsort - hoomanab - 02 دى ۱۳۹۲ ۰۸:۲۴ ب.ظ

شاید منظور سوال این بوده که که ابتدا صعودیش کنیم بعد بریزیمش توی ماکس هیپ که نزولی بشه.

Sent from my SM-T210R using Tapatalk

RE: heapsort - آنجلا - ۰۲ دى ۱۳۹۲ ۱۱:۱۱ ب.ظ

الگوریتم هیپ سورت از دو مرحله تشکیل شده :

الف) یک درخت هیپ از عناصر آرایه A بسازیم.
ب) عنصر ریشه H را به طور مکرر حذف کنیم.
شما در مورد گزینه ۲ فقط مرحله الف رو در نظر گرفتید... البته اگه آرایه نزولی باشه با ( O(n میشه درخت ماکس هیپ رو ساخت اما موقع حذف کردن و بازسازی صعودی آرایه گزینه ۲ فایده ای نداره و دوباره آرایه مثل اولش میشه.. به نظر من گزینه ۲ اصلا به درد نمیخوره... شاید به همین خاطره که برای مرتب سازی صعودی از مین هیپ استفاده میکنن.

RE: heapsort - mfXpert - 03 دى ۱۳۹۲ ۱۲:۱۱ ق.ظ

(۰۲ دى ۱۳۹۲ ۰۷:۳۸ ب.ظ)mhd3 نوشته شده توسط:  --سوال اولم اینه که مگه برای مرتب کردن صعودی از مین هیپ استفاده نمیکردیم؟؟
از ماکس هیپ هم میشه استفاده کرد. بعد از ساختن ماکس هیپ به این صورت عمل می‌کنیم که عنصر ریشه (یعنی همون بزرگترین عنصر) رو با خونه‌ی آخر آرایه جابجا می‌کنیم (آخرین خونه‌ی آرایه میشه همون سنت راست‌ترین برگ سطح آخر). حالا بدون در نظر گفتن خونه‌ی آخر آرایه عمل هیپ کردن آرایه رو انجام می‌دیم. تو مرحله‌ی بعد باز ریشه رو با خونه‌ی یکی مونده به آخر جابجا می‌کنیم و به همین ترتیب. اگر همین روند رو دنبال کنید می‌ببنید که در نهایت آرایه‌ای داریم که به صورت صعودی مرتب شده.

در واقع تو این روش شما اعداد رو (مثلا) در خروجی چاپ نمی‌کنید بلکه اعداد به صورت مرتب در خود همون آرایه ورودی قرار می‌گیرن.

RE: heapsort - mhd3 - 03 دى ۱۳۹۲ ۱۲:۱۵ ق.ظ

(۰۲ دى ۱۳۹۲ ۱۱:۱۱ ب.ظ)آنجلا نوشته شده توسط:  الگوریتم هیپ سورت از دو مرحله تشکیل شده :

الف) یک درخت هیپ از عناصر آرایه A بسازیم.
ب) عنصر ریشه H را به طور مکرر حذف کنیم.
شما در مورد گزینه ۲ فقط مرحله الف رو در نظر گرفتید...

مرسی عزیزم.
خیلی لطف کردی.
آره، درست میگی. من اصلا به حذف توجه نکرده بودم.
ممنون Smile

(۰۳ دى ۱۳۹۲ ۱۲:۱۱ ق.ظ)mfXpert نوشته شده توسط:  
(02 دى ۱۳۹۲ ۰۷:۳۸ ب.ظ)mhd3 نوشته شده توسط:  --سوال اولم اینه که مگه برای مرتب کردن صعودی از مین هیپ استفاده نمیکردیم؟؟
از ماکس هیپ هم میشه استفاده کرد. بعد از ساختن ماکس هیپ به این صورت عمل می‌کنیم که عنصر ریشه (یعنی همون بزرگترین عنصر) رو با خونه‌ی آخر آرایه جابجا می‌کنیم (آخرین خونه‌ی آرایه میشه همون سنت راست‌ترین برگ سطح آخر). حالا بدون در نظر گفتن خونه‌ی آخر آرایه عمل هیپ کردن آرایه رو انجام می‌دیم. تو مرحله‌ی بعد باز ریشه رو با خونه‌ی یکی مونده به آخر جابجا می‌کنیم و به همین ترتیب. اگر همین روند رو دنبال کنید می‌ببنید که در نهایت آرایه‌ای داریم که به صورت صعودی مرتب شده.

در واقع تو این روش شما اعداد رو (مثلا) در خروجی چاپ نمی‌کنید بلکه اعداد به صورت مرتب در خود همون آرایه ورودی قرار می‌گیرن.

بله امتحان کردم.
خیلی ممنون. Smile