در این مقاله قصد داریم در مورد الگوریتم مرتب سازی سریع (Quick Sort) صحبت کنیم، که یکی از پرکاربردترین و کارآمدترین الگوریتمهای مرتب سازی است. این الگوریتم با استفاده از روش تقسیم و غلبه، مجموعهای از دادهها را به زیرمجموعههای کوچکتر تقسیم کرده و آنها را به صورت منظم مرتب میسازد. با توجه به پیچیدگی زمانی O(nlogn) در حالت میانگین، الگوریتم مرتب سازی سریع بهویژه برای دادههای بزرگ بسیار موثر است. برای اطلاع از این موضوع و موضوعات دیگر با مجله پیاستور همراه شوید.
الگوریتم مرتب سازی سریع چیست؟
الگوریتم مرتب سازی سریع (QuickSort) یکی از کارآمدترین و پرکاربردترین الگوریتمهای مرتبسازی است که از روش تقسیم و غلبه (Divide and Conquer) استفاده میکند. در این الگوریتم، ابتدا یک عنصر بهعنوان Pivot انتخاب میشود و سپس عناصر آرایه بر اساس مقدار Pivot به دو بخش تقسیم میشوند: یکی شامل مقادیر کوچکتر یا مساوی Pivot و دیگری شامل مقادیر بزرگتر. این فرآیند بهصورت بازگشتی روی هر بخش ادامه مییابد تا آرایه بهطور کامل مرتب شود. QuickSort بهدلیل سرعت بالا، بهویژه در دادههای بزرگ، و نیاز کم به حافظه، در بسیاری از نرمافزارها و سیستمهای کاربردی مورد استفاده قرار میگیرد.
نحوه کار الگوریتم مرتب سازی سریع (QuickSort)
Pivot عنصری است که الگوریتم QuickSort بر اساس آن لیست را به دو قسمت تقسیم میکند:
- عناصر کوچکتر یا مساوی Pivot
- عناصر بزرگتر از Pivot
روش انتخاب Pivot تأثیر زیادی بر کارایی الگوریتم دارد. در ادامه چند روش رایج برای انتخاب Pivot را توضیح میدهیم:
۱. انتخاب اولین عنصر بهعنوان Pivot
لیست: [۹, ۴, ۶, ۲, ۸, ۱, ۵] ↑ Pivot = 9
- سادهترین روش.
- در صورت مرتب یا تقریباً مرتب بودن آرایه، کارایی بدی دارد (O(n²)).
۲. انتخاب آخرین عنصر بهعنوان Pivot
لیست: [۹, ۴, ۶, ۲, ۸, ۱, ۵] ↑ Pivot = 5
- مانند انتخاب اول، ساده است ولی ممکن است باعث تقسیم نامتوازن شود.
۳. انتخاب عنصر میانی
لیست: [۹, ۴, ۶, ۲, ۸, ۱, ۵] ↑ Pivot = ۶ (عنصر وسط)
- احتمال تقسیم متعادلتر نسبت به روش اول و دوم.
۴. انتخاب تصادفی (Random Pivot)
لیست: [۹, ۴, ۶, ۲, ۸, ۱, ۵] ↑ Pivot = 2 (مثلاً انتخاب تصادفی)
- احتمالاً بهترین روش برای جلوگیری از بدترین حالت.
- کارایی بالاتر در دادههای واقعی.
۵. میانه سه عدد (Median-of-three)
- انتخاب میانه بین اولین، وسطی و آخرین عنصر لیست.
لیست: [۹, ۴, ۶, ۲, ۸, ۱, ۵] اولین: ۹ وسطی: ۲ آخرین: ۵ → میانه = 5 → Pivot = 5
- تلاش برای انتخاب Pivot نزدیک به میانه واقعی لیست.
- کارایی بهتر در لیستهای جزئی مرتب شده.
تحلیل زمان و فضای الگوریتم مرتب سازی سریع
تحلیل زمان و فضای الگوریتم مرتب سازی سریع (Quicksort) برای درک کارایی آن بسیار مهم است. در این بخش به بررسی پیچیدگی زمانی و فضایی این الگوریتم خواهیم پرداخت.
تحلیل زمان
۱. پیچیدگی زمانی در بهترین حالت
در بهترین حالت، الگوریتم وقتی که آرایه بهخوبی تقسیم میشود اجرا میشود، یعنی پیوت بهطور متوازن عناصر را تقسیم کند.
- تعداد مقایسهها: در هر مرحله، با انتخاب پیوت در وسط، الگوریتم دو زیرآرایه تقریباً برابر (نصف) را میسازد.
- تحلیل: اگر در هر سطح عمق درخت جستجو، n عناصر درگیر باشند، تعداد مقایسهها برابر با 2n خواهد بود.
- پیچیدگی زمانی: O(nlogn)
۲. پیچیدگی زمانی در بدترین حالت
بدترین حالت، زمانی است که آرایه کاملاً مرتب شده باشد (یا معکوس مرتب شده باشد) و پیوت همیشه اولین یا آخرین عنصر انتخاب شود.
- تعداد مقایسهها: در هر مرحله تنها یک عنصر به درخت اضافه میشود و پیوت در پایان آرایه قرار دارد، بنابراین تعداد مقایسهها به حداکثر میرسد.
- تحلیل: در این حالت، تعداد مقایسهها به n+(n−۱)+(n−۲)+…+۱=۲n(n−۱) میرسد.
- پیچیدگی زمانی: O(n²)
۳. پیچیدگی زمانی در حالت میانگین
در حالت میانگین، پیوت بهطور تصادفی انتخاب میشود و معمولاً آرایهها بهخوبی تقسیم میشوند.
- تحلیل: با توجه به نحوه انتخاب پیوت، تعداد مقایسهها در بیشتر مواقع به تعداد قابل قبولی میرسد.
- پیچیدگی زمانی: O(nlogn)
جمعبندی تحلیل زمان
- بهترین حالت: O(nlogn)
- بدترین حالت:O(n²)
- حالت میانگین: O(nlogn)
الگوریتم مرتب سازی سریع (Quicksort) به دلیل کارایی بالای خود و سادگی در پیادهسازی، یکی از محبوبترین الگوریتمها در زمینه مرتبسازی دادهها است. با پیچیدگی زمانی O(nlogn) در بهترین و حالت میانگین، و قابلیت استفاده در مجموعههای داده بزرگ، Quicksort بهعنوان گزینهای کارآمد شناخته میشود؛ هرچند در بدترین حالت، زمانی معادل O(n²) را ممکن است تجربه کند. انتخاب هوشمند پیوت و تکنیکهای بهینهسازی در این الگوریتم میتواند کارایی آن را بهبود بخشد. همچنین، بهخاطر تطبیقپذیری آن، در بسیاری از زبانهای برنامهنویسی بهعنوان روش پیشفرض مرتبسازی استفاده میشود و در حوزههایی از جمله یادگیری ماشین و علوم داده کاربردهای گستردهای دارد. شناخت و درک Quicksort بهعنوان یک مبنای مهم در علوم کامپیوتر به شمار میآید.