مرتب‌سازی ادغام-درج

از testwiki
نسخهٔ تاریخ ۲۰ ژوئیهٔ ۲۰۲۴، ساعت ۰۱:۱۲ توسط imported>Lvova (الگوریتم: ویکی‌پدیا:ویکی‌پروژه تصحیح ویکی‌پدیا -> middle priority → شناسهٔ ISBN نادرست، جایگزین شد، جایگزین شد: <now با استفاده از AWB)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

الگو:ادغام از در علوم رایانه، مرتب‌سازی ادغام-درج یا الگوریتم فورد-جانسون از الگوریتم‌های مرتب‌سازی مقایسه‌ای است که در سال ۱۹۵۹ توسط لستر رادولف فورد و سلمر مارتین جانسون منتشر شد. این الگوریتم از الگوریتم‌های شناخته شده قبلی همچون مرتب‌سازی درجی دودویی و مرتب‌سازی ادغامی در بدترین حالت، از تعداد مقایسه‌های کمتری استفاده می‌کند.

مشخص است که کم بودن تعداد مقایسه‌ها معیاری مناسب برای اثربخشی یک الگوریتم مرتب‌سازی نیست؛ امّا از دیدگاه نظری کمینه کردن تعداد مقایسه‌ها در مسائل مرتب‌سازی همواره مهم بوده‌است.[۱] همین الگوریتم توسط ریاضیدان لهستانی به‌طور مستقل کشف شد.

مقدمه ای بر الگوریتم

فرض می‌کنیم ۵ عدد داریم (a,b,c,d,e)، آن‌ها را به سه دسته تقسیم می‌کنیم: (a,b)(c,d)(e)

سپس دو عدد موجود در دسته‌های دوتایی را باهم مقایسه می‌کنیم و بعد از آن دو عدد بزرگتر هر دسته را با یکدیگر مقایسه می‌کنیم. فرض می‌کنیم

a>b,c>d

. آنگاه باید دو عدد

a,c

را با هم مقایسه کنیم. در شکل‌های زیر جهت پیکان از عدد کوچکتر به سمت عدد بزرگتر است.الگو:سخ

با توجه به شکل بالا داریم b<a<c. اکنون باید عنصر e را بین این سه عنصر مرتب شده درج کنیم که با دو مقایسه امکان‌پذیر است. (مرتب‌سازی درجی دودویی) سپس بعد از معلوم شدن جایگاه e، عنصر d را در صف مرتب شده درج می‌کنیم که آن نیز با دو مقایسه امکان‌پذیر است.

الگوریتم

الگوریتم فورد-جانسون یا مرتب‌سازی ادغام-درج تعمیم جالبی از مقدمه بالاست. مراحل این الگوریتم به شرح زیر است:[۱][۲][۳]

ادغام

  1. n عنصر موجود را به n2 گروه دوتایی تقسیم می‌کنیم؛ و اگر n فرد بود، یک عنصر جفت نشده باقی می‌ماند.
  2. n2مقایسه انجام می‌دهیم تا عنصر بزرگتر در هر گروه را بیابیم.
  3. n2 عنصر بزرگتر را به شکل بازگشتی مرتب می‌کنیم. حال عناصر مرتب شده را زنجیره اصلی می‌نامیم که به صورت aiدر شکل نمایش داده شده‌است.
  4. سپس با توجه به این که زنجیره اصلی مرتب شده‌است و عنصر a1 کوچکترین عنصر زنجیره است و می‌دانیم b1 از آن کوچکتر است، بنابراین می‌توان b1 را در ابتدای زنجیره درج نمود.
  5. بقیه عناصر که به شکل bi نشان داده شده‌است را در زنجیره اصلی درج می‌کنیم. (با استفاده از مرتب‌سازی درجی)

درج

روش درج کردن biها به ترتیب زیر است:الگو:وسط‌چین b3,b2;b5,b4;b11,b10,...,b6;.....;btk,btk1,......,btk1+1

(t1,t2,t3,t4,...)=(1,3,5,11,...) الگو:پایانسپس در آخر در صورت وجود، bn2+1 را در زنجیره اصلی درج می‌نماییم.[۴]

تحلیل الگوریتم

برای بررسی تعداد مقایسه‌ها ابتدا به مقادیر tkها می‌پردازیم. این مقادیر باید باید به گونه‌ای باشند که تعداد عناصر زنجیره اصلی هنگام درج یک عنصر در مرحله kام برابر 2k1باشد.

در نتیجه داریم:الگو:وسط‌چین 2tk1+(tktk1)1=2k1tk+tk1=2k,t1=1 الگو:پایانبا حل رابطه بازگشتی بالا به جواب زیر می‌رسیم:الگو:وسط‌چین tk=13(2k+1+(1)k) الگو:پایانF(n)را تعداد مقایسه‌های الگوریتم فورد-جانسون برای nعنصر می‌گیریم. ابتدا n2مقایسه برای پیدا کردن عنصر بزرگتر در هر دسته داریم و سپس زنجیره اصلی را به شکل بازگشتی مرتب می‌کنیم و Gهم تعداد مقایسه‌ها برای درج عناصر کوچکتر دسته‌ها در زنجیره اصلی است.الگو:وسط‌چین F(n)=n2+F(n2)+G(n2) الگو:پایانو برای هر tk1ntk،G(n)برابر است با j=1k1[j(tjtj1)]+k(ntk1).الگو:وسط‌چین j=1k1[j(tjtj1)]+k(ntk1)=kn(t0+t1+t2+...+tk1)

wk=t0+t1+t2+...+tk1(w0,w1,w2,w3,...)=(0,1,2,5,...) الگو:پایانپس از تعریف wkبه شکل بالا می‌توان ثابت کرد : F(n)F(n1)=kwk<nwk+1

و شرط بالا معادل است با : 2k+13<n<2k+23k+1<log(3n)k+2

بنابرابن داریم : F(n)F(n1)=log(34n)

در نتیجه: F(n)=k=1nlog(34k)

مقایسه با سایر الگوریتم‌ها

نام این الگوریتم ادغام-درج است زیرا مقایسه‌های اولیه که قبل از فراخوانی بازگشتی انجام می‌شود، همچون مقایسه‌های الگوریتم مرتب‌سازی ادغامی است و همچنین مقایسه‌هایی که بعد از فراخوانی بازگشتی صورت می‌گیرد، مانند الگوریتم مرتب‌سازی درجی دودویی است. در واقع می‌توان الگوریتم فورد-جانسون را الگوریتم چندگانه نامید زیرا تلفیقی از دو مرتب‌سازی درجی و ادغامی است.

تعداد مقایسه‌های این الگوریتم مرتب‌سازی برای n11برابر با کران پایین تعداد مقایسه‌های مرتب‌سازی‌های مقایسه‌ای است. این کران پایین برابر است با log2n!nlog2n1.443n

امّا تعداد مقایسه برای nهای بزرگتر بیشتر از این کران پایین است.

همان‌طور که در جدول زیر دیده می‌شود، تعداد مقایسه‌ها در الگوریتم فورد-جانسون از دو الگوریتم ادغامی و درجی برای nهای کوچکتر از 18 کمتر است.[۱]الگو:سخ

تعداد مقایسه‌ها در بدترین حالت
۱۷ ۱۶ ۱۵ ۱۴ ۱۳ ۱۲ ۱۱ ۱۰ ۹ ۸ ۷ ۶ ۵ ۴ ۳ ۲ ۱ n
۵۴ ۴۹ ۴۵ ۴۱ ۳۷ ۳۳ ۲۹ ۲۵ ۲۱ ۱۷ ۱۴ ۱۱ ۸ ۵ ۳ ۱ ۰ مرتب‌سازی درجی
۶۵ ۴۹ ۴۵ ۴۱ ۳۸ ۳۳ ۳۰ ۲۷ ۲۵ ۱۷ ۱۴ ۱۱ ۹ ۵ ۳ ۱ ۰ مرتب‌سازی ادغامی
۵۰ ۴۶ ۴۲ ۳۸ ۳۴ ۳۰ ۲۶ ۲۲ ۱۹ ۱۶ ۱۳ ۱۰ ۷ ۵ ۳ ۱ ۰ مرتب‌سازی ادغام-درج

الگوریتم‌های بهینه تر

تا به امروز الگوریتم بهینه‌تر از نظر زمانی برای الگوریتم فورد-جانسون ارائه شده‌است که تعداد مقایسه‌های دقیقاً برابر فورد-جانسون است؛ امَا زمان کمتری می‌گیرد بدین گونه که به جای فراخوانی بازگشتی بر روی نصف لیست اعداد، بر روی یک چهارم لیست اعداد می‌باشد.[۵]

تا بیست سال الگوریتم فورد-جانسون، کمترین تعداد مقایسه را میان الگوریتم‌های مرتب‌سازی داشت. در سال ۱۹۷۹ گلن ماناکر الگوریتم مرتب‌سازی دیگری ارائه کرد که تعداد مقایسه‌های آن از فورد-جانسون حتی برای ورودی‌ها با تعداد زیاد نیز کمتر بود.

ماناکر نشان داد الگوریتم فورد-جانسون برای محدوده‌ای از مقادیر بهینه است. امروزه الگوریتمی ارائه شده‌است که به نتایج قوی‌تری نسبت به الگوریتم ماناکر دست یافته‌است.[۶]

منابع

الگو:پانویس

  1. ۱٫۰ ۱٫۱ ۱٫۲ Knuth, Donald (1997), "§5.2.3, Sorting by Selection", Sorting and Searching, The Art of Computer Programming, 3 (third ed.), Addison-Wesley, pp. 144–155, ISBN 978-0-201-89685-5
  2. قدسی، محمد، داده ساختارها و مبانی الگوریتم‌ها، چاپ دوم، انتشارات فاطمی، ۱۳۸۹.
  3. Cormen, Thomas H. ; Leiserson, Charles E. ; Rivest, Ronald L. ; Stein, Clifford (2009) [1990]. Introduction to Algorithms (3rd ed.). MIT Press and McGraw-Hill. ISBN 0-262-03384-4.
  4. الگو:Cite journal
  5. الگو:یادکرد وب
  6. الگو:یادکرد وب