Recursion अधिक सहज ज्ञान युक्त इसलिए मैं कुछ स्थितियों में छोड़कर ही पसंद करते हैं तब होता है जब मैं एक से बचना चाहते हैं महत्वपूर्ण ढेर गहराई (उदाहरण के लिए कुछ सह-नियमित कार्यान्वयन का उपभोग करते समय)। मर्ज सॉर्ट के मामले में हालांकि पुनरावृत्त संस्करण वास्तव में पालन करना आसान है (कम से कम छद्म कोड)।
यह आवश्यक है कि आंतरिक लूप के साथ घोंसला वाला लूप 2^के तत्वों के जोड़े पर विलय कर रहा है जिसमें बाहरी लूप को बढ़ाने के लिए ज़िम्मेदार है।
एक अतिरिक्त चरण जो आवश्यक है, पिछले विलय वाले समूह के साथ किसी भी unpaired समूह को मर्ज करना है। यदि तत्वों की संख्या 2 की शक्ति नहीं है तो एक unpaired समूह का सामना किया जाएगा। एक unpaired समूह हमेशा पुनरावृत्ति के अंत में होगा।
उदा। [5, 7, 3, 4, 1, 9] -> [5, 7] [3, 4] [1, 9] -> [3, 4, 5, 7] [1, 9] -> [ 1, 3, 4, 5, 7, 9]
उपरोक्त उदाहरण में [1, 9] एक समूह है जिसमें प्रारंभिक रूप से विलय करने वाला कोई अन्य समूह नहीं था। इस प्रकार यह पिछले समूह (जो विलय कर दिया गया था और पहले से ही क्रमबद्ध)
यहाँ एक अजगर कार्यान्वयन है साथ विलय कर दिया गया था:
from MergeSort import merge
def sort(arr):
n = len(arr) - 1
c = 1
start = 0
mid = 0
end = 0
while c <= n:
while end < n:
mid = start + c//2
end = start + c
if (start < n) and (end <= n):
merge(arr, start, mid, end)
start = end + 1
else:
merge(arr, start - c - 1, start-1, n)
c = 2*c + 1
start = 0
mid = 0
end = 0
मैं नियमित रूप से (पुनरावर्ती) संस्करण से मर्ज फ़ंक्शन का उपयोग किया। जबकि उपरोक्त कोड सबसे सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है और रिकर्सिव संस्करण के समान जटिलता है।(मैं अच्छी तरह से जाँच नहीं की है, लेकिन यह एक नज़र से मेरे लिए इतना लगता है)
यहाँ एक इकाई परीक्षण है:
def test_merge_sort_iterative(self):
for i in range(1, 100):
length = randint(10, 5000)
data = [randint(1, 10000) for x in range(1, length)]
IterativeMergeSort.sort(data)
issorted = True
i = 0
while (i < len(data) - 1) & issorted:
if data[i] > data[i + 1]:
issorted = False
i += 1
self.assertTrue(issorted, data)
return
यहाँ जवाब पर विचार करें: http://stackoverflow.com/questions/2171517/ को लागू करने में एक mergesort-बिना-का उपयोग कर-एक-अतिरिक्त सरणी – Marcin