مرتبسازی شانهای
| کلاس | الگوریتم مرتب سازی |
|---|---|
| داده ساختار | آرایه |
| بدترین زمان اجرا | [نیازمند منبع] |
| بدترین پیچیدگی حافظه | ![]() |
مرتبسازی شانهای (به انگلیسی: comb sort) یک الگوریتم مرتبسازی ساده است که توسط ولادیمیر دوبوسوویچ در سال ۱۹۸۰ طراحی شد. بعدها این الگوریتم در اثر مقاله ای که توسط استیفن لیسی و ریچارد باکس در سال ۱۹۹۱ در مجله بایت منتشر شد معروفیت پیدا کرد.مرتب سازی شانه ای بهینه شده ای از مرتبسازی حبابی است. ایدهٔ اصلی حذف لاک پشت ها، یا مقادیر کوچک نزدیک پایان است، که در مرتبسازی حبابی سرعت الگوریتم را به شدت پایین می آورند. (خرگوشها مقادیر بزرگ نزدیک ابتدا مشکل حادی در مرتب سازی حبابی ایجاد نمی کنند.).
در مرتبسازی حبابی وقتی که هر دو عنصری مقایسه شوند همیشه شکاف 1 دارند، ایده اصلی مرتبسازی شانهای این است که شکاف بیشتر از یک میتواند باشد.
شکاف وقتی شروع میشود که طول لیست توسط عامل چروک تقسیم میشود و لیست طبق آن مقدار برای شکاف مرتب میشود. سپس شکاف دوباره تقسیم بر عامل چروک می شود. و پروسه تا جایی ادامه مییابد که شکاف برابر 1 شود. در این مرحله مرتبسازی شانهای با استفاده از شکاف 1 تا پایان مرتب شدن تمام لیست ادامه میدهد. مرحله پایانی مرتبسازی شانهای شبیه مرتبسازی حبابی است، ولی اینجا بیشتر لاکپشتها حل شدهاند بنابراین بسیار کارآمدتر از مرتبسازی حبابی عمل میکند.
محتویات |
عامل چروک[ویرایش]
عامل چروک اثر بسیار زیادی بر بازده مرتبسازی شانهای دارد. در مقاله اصلی مولفان 1.3 را پس از بررسی لیستهای تصادفی زیادی پیشنهاد کردهاند. ولی پس از آن مشخص شد که استفاده از
نتیجه بهتری خواهد داد.
تغییرپذیریها[ویرایش]
با استفاده از عامل چروک 1.3 تنها سه راه ممکن برای شکافها برای اتمام وجود دارد: (9, 6, 4, 3, 2, 1)،(10, 7, 5, 3, 2, 1)،(11, 8, 6, 4, 3, 2, 1).آزمایشات نشان میدهد که بهبودهای عمده میتواند حاصل شود اگر شکاف بر 11 تنظیم شود.
پیادهسازی[ویرایش]
شبه کد مرتبسازی شانهای
gap := input.size //initialize gap size
loop until gap <= 1 and swaps = 0
//update the gap value for a next comb. Below is an example
gap := int(gap / 1.25)
i := 0
swaps := 0 //see مرتبسازی حبابی for an explanation
//a single "comb" over the input list
loop until i + gap >= input.size //see مرتبسازی شل for similar idea
if input[i] > input[i+gap]
swap(input[i], input[i+gap])
swaps := 1 // Flag a swap has occurred, so the
// list is not guaranteed sorted
end if
i := i + 1
end loop
end loop
end function
پیاده سازی در ++C
template<class ForwardIterator> void combsort ( ForwardIterator first, ForwardIterator last ) { static const double shrink_factor = 1.247330950103979; typedef typename std::iterator_traits<ForwardIterator>::difference_type difference_type; difference_type gap = std::distance(first, last); bool swaps = true; while ( (gap > 1) || (swaps == true) ){ if (gap > 1) gap = static_cast<difference_type>(gap/shrink_factor); swaps = false; ForwardIterator itLeft(first); ForwardIterator itRight(first); std::advance(itRight, gap); for ( ; itRight!=last; ++itLeft, ++itRight ){ if ( (*itRight) < (*itLeft) ){ std::iter_swap(itLeft, itRight); swaps = true; } } } }
پیادهسازی در جاوا
public static <E extends Comparable<? super E>> void sort(E[] input) { int gap = input.length; boolean swapped = true; while (gap > 1 || swapped) { if (gap > 1) { gap = (int) (gap / 1.3); } int i = 0; swapped = false; while (i + gap < input.length) { if (input[i].compareTo(input[i + gap]) > 0) { E t = input[i]; input[i] = input[i + gap]; input[i + gap] = t; swapped = true; } i++; } } }
جُستارهای وابسته[ویرایش]
- مرتب سازی حبابی، الگوریتمی کندتر که پایهٔ مرتبسازی شانهای است.
پیوند به بیرون[ویرایش]
منابع[ویرایش]
Wikipedia contributors, «Comb sort», Wikipedia, The Free Encyclopedia,
http://en.wikipedia.org/wiki/Comb_sort
Demuth, H. Electronic Data Sorting. PhD thesis, Stanford University, 1956.
- دانلد کنوت, هنر برنامهنویسی رایانه, Volume 3: Sorting and Searching.
|
|||||||||||||||||||||||||||||||

