مرتبسازی مسابقهای
مرتبسازی مسابقهای (به انگلیسی: Tournament sort) یک الگوریتم مرتبسازی است. این الگوریتم مرتبسازی انتخابی ساده را با استفاده از یک صف اولویتدار یا یک درخت برنده برای پیدا کردن عنصر بعدی در مرتبسازی بهبود میبخشد. در مرتبسازی انتخابی ساده،
رده | الگوریتم مرتبسازی |
---|---|
ساختمان داده | درخت برنده (آرایه) |
کارایی بدترین حالت | |
کارایی متوسط | |
پیچیدگی فضایی |
پیادهسازی با درخت برنده
درخت برنده نوعی درخت مسابقه است که از
اگر برنده را در هر تکمسابقه بازیکنی در نظر بگیریم که مقدار آن کمتر است؛ در این صورت ریشه درخت اشاره به بازیکنی خواهد داشت که کمترین مقدار را بین تمام بازیکنان دارد. با طراحی چنین داده ساختاری میتوان الگوریتم مرتبسازی مسابقهای را اجرا نمود. اگر آرایه مورد نظر برای مرتبسازی دارای
زمان اجرا و پیچیدگی فضایی الگوریتم
زمان اجرای این الگوریتم به دو قسمت تقسیم میشود. به اندازه
مقدار حافظه لازم برای این الگوریتم متشکل است از آرایهٔ اولیه و آرایهٔ مرتب شده و یک درخت مسابقه که تعداد رئوس خارجی آن از ۲ برابر تعداد بازیکنان کمتر است. در درخت مسابقه تعداد رئوس داخلی همیشه یکی کمتر از تعداد رئوس خارجی است. پس در کل پیچیدگی فضایی این الگوریتم از
پیادهسازی به زبان پایتون
مرتبسازی مسابقهای با استفاده از درخت برنده (آرایه) در زبان برنامهنویسی پایتون به صورت زیر پیادهسازی میشود. در این پیادهسازی از مفهوم هرم کمینه، که نوعی هرم دودویی است، استفاده شده که در آن هر راس با اندیس
import math
def build(A, B, x, l, r):
if l == r:
B[x] = (A[l], x)
else:
mid = (l + r) // 2
build(A, B, 2 * x, l, mid)
build(A, B, (2 * x) + 1, mid + 1, r)
if B[(2 * x) + 1][0] < B[2 * x][0]:
B[x] = B[(2 * x) + 1]
else:
B[x] = B[2 * x]
def pop(B):
result = B[1][0]
index = B[1][1]
B[index] = None
while index > 1:
index = index // 2
if B[index * 2] is None:
minimum = B[(index * 2) + 1]
elif B[(index * 2) + 1] is None:
minimum = B[index * 2]
else:
minimum = min(B[index * 2], B[(index * 2) + 1])
if minimum == B[index]:
break
B[index] = minimum
return result
A = [-8, 3, 17, 57, 0, -19, 21, 5, 965 , 2, 0, 1, 34, 83]
n = len(A)
B = [None] * (2 ** (math.ceil(math.log2(n)) + 1))
build(A, B, 1, 0, n - 1)
sorted_array = [pop(B) for _ in range(n)]
print(sorted_array)
جستارهای وابسته
منابع
Donald Knuth, The Art of Computer Programming, Sorting and Searching, Volume 3, 1973.
Stepanov, Alexander and Aaron Kershenbaum. Using Tournament Trees to Sort, Brooklyn: Center for Advanced Technology in Telecommunications, 1986.
https://www.cise.ufl.edu/~sahni/cop3530/slides/lec252.pdf