Natural merge: mergesort that uses already sorted subarrays












2














The code bellow is my implementation for the natural merge exercise in Robert Sedgwick's Algorithms book:




Write a version of bottom-up mergesort that takes advantage of order
in the array by proceeding as follows each time it needs to find two
arrays to merge: find a sorted subarray (by incrementing a pointer
until finding an entry that is smaller than its predecessor in the
array), then find the next, then merge them.




def merge(a, lo, mi, hi):
aux_lo = deque(a[lo:mi])
aux_hi = deque(a[mi:hi])
# this takes more space than allowed

for i in range(lo, hi):
if len(aux_lo) and len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo[0] < aux_hi[0] else aux_hi.popleft()
elif len(aux_lo) or len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo else aux_hi.popleft()

def find_next_stop(a, start):
if start >= len(a)-1:
return start

stop = start + 1
if a[start] < a[stop]:
while(stop<len(a)-1 and a[stop] <= a[stop+1]):
stop += 1
else:
while(stop<len(a)-1 and a[stop] >= a[stop+1]):
stop += 1

_stop = stop
while(start<_stop):
a[_stop], a[start] = a[start], a[_stop]
start += 1
_stop -= 1
return stop

def natural_merge(a):
lo = hi = 0
while(True):
lo = hi
mi = find_next_stop(a, lo)
if lo == 0 and mi == len(a) - 1:
return
hi = find_next_stop(a, mi)
if mi == hi == len(a)-1:
lo = hi = 0
continue
merge(a, lo, mi, hi)


I take this anwser as a reference.










share|improve this question
























  • Add docstrings and typed arguments. Otherwise it's not bad
    – Reinderien
    43 mins ago










  • A pity the code presented is uncommented but for a cryptic this takes more space than allowed - extra constraint(s)? (There's more than one error in I take this anwser as a referenced..)
    – greybeard
    35 mins ago
















2














The code bellow is my implementation for the natural merge exercise in Robert Sedgwick's Algorithms book:




Write a version of bottom-up mergesort that takes advantage of order
in the array by proceeding as follows each time it needs to find two
arrays to merge: find a sorted subarray (by incrementing a pointer
until finding an entry that is smaller than its predecessor in the
array), then find the next, then merge them.




def merge(a, lo, mi, hi):
aux_lo = deque(a[lo:mi])
aux_hi = deque(a[mi:hi])
# this takes more space than allowed

for i in range(lo, hi):
if len(aux_lo) and len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo[0] < aux_hi[0] else aux_hi.popleft()
elif len(aux_lo) or len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo else aux_hi.popleft()

def find_next_stop(a, start):
if start >= len(a)-1:
return start

stop = start + 1
if a[start] < a[stop]:
while(stop<len(a)-1 and a[stop] <= a[stop+1]):
stop += 1
else:
while(stop<len(a)-1 and a[stop] >= a[stop+1]):
stop += 1

_stop = stop
while(start<_stop):
a[_stop], a[start] = a[start], a[_stop]
start += 1
_stop -= 1
return stop

def natural_merge(a):
lo = hi = 0
while(True):
lo = hi
mi = find_next_stop(a, lo)
if lo == 0 and mi == len(a) - 1:
return
hi = find_next_stop(a, mi)
if mi == hi == len(a)-1:
lo = hi = 0
continue
merge(a, lo, mi, hi)


I take this anwser as a reference.










share|improve this question
























  • Add docstrings and typed arguments. Otherwise it's not bad
    – Reinderien
    43 mins ago










  • A pity the code presented is uncommented but for a cryptic this takes more space than allowed - extra constraint(s)? (There's more than one error in I take this anwser as a referenced..)
    – greybeard
    35 mins ago














2












2








2







The code bellow is my implementation for the natural merge exercise in Robert Sedgwick's Algorithms book:




Write a version of bottom-up mergesort that takes advantage of order
in the array by proceeding as follows each time it needs to find two
arrays to merge: find a sorted subarray (by incrementing a pointer
until finding an entry that is smaller than its predecessor in the
array), then find the next, then merge them.




def merge(a, lo, mi, hi):
aux_lo = deque(a[lo:mi])
aux_hi = deque(a[mi:hi])
# this takes more space than allowed

for i in range(lo, hi):
if len(aux_lo) and len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo[0] < aux_hi[0] else aux_hi.popleft()
elif len(aux_lo) or len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo else aux_hi.popleft()

def find_next_stop(a, start):
if start >= len(a)-1:
return start

stop = start + 1
if a[start] < a[stop]:
while(stop<len(a)-1 and a[stop] <= a[stop+1]):
stop += 1
else:
while(stop<len(a)-1 and a[stop] >= a[stop+1]):
stop += 1

_stop = stop
while(start<_stop):
a[_stop], a[start] = a[start], a[_stop]
start += 1
_stop -= 1
return stop

def natural_merge(a):
lo = hi = 0
while(True):
lo = hi
mi = find_next_stop(a, lo)
if lo == 0 and mi == len(a) - 1:
return
hi = find_next_stop(a, mi)
if mi == hi == len(a)-1:
lo = hi = 0
continue
merge(a, lo, mi, hi)


I take this anwser as a reference.










share|improve this question















The code bellow is my implementation for the natural merge exercise in Robert Sedgwick's Algorithms book:




Write a version of bottom-up mergesort that takes advantage of order
in the array by proceeding as follows each time it needs to find two
arrays to merge: find a sorted subarray (by incrementing a pointer
until finding an entry that is smaller than its predecessor in the
array), then find the next, then merge them.




def merge(a, lo, mi, hi):
aux_lo = deque(a[lo:mi])
aux_hi = deque(a[mi:hi])
# this takes more space than allowed

for i in range(lo, hi):
if len(aux_lo) and len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo[0] < aux_hi[0] else aux_hi.popleft()
elif len(aux_lo) or len(aux_hi):
a[i] = aux_lo.popleft() if aux_lo else aux_hi.popleft()

def find_next_stop(a, start):
if start >= len(a)-1:
return start

stop = start + 1
if a[start] < a[stop]:
while(stop<len(a)-1 and a[stop] <= a[stop+1]):
stop += 1
else:
while(stop<len(a)-1 and a[stop] >= a[stop+1]):
stop += 1

_stop = stop
while(start<_stop):
a[_stop], a[start] = a[start], a[_stop]
start += 1
_stop -= 1
return stop

def natural_merge(a):
lo = hi = 0
while(True):
lo = hi
mi = find_next_stop(a, lo)
if lo == 0 and mi == len(a) - 1:
return
hi = find_next_stop(a, mi)
if mi == hi == len(a)-1:
lo = hi = 0
continue
merge(a, lo, mi, hi)


I take this anwser as a reference.







python algorithm python-3.x sorting mergesort






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 4 mins ago









200_success

128k15150412




128k15150412










asked 52 mins ago









lerner

1615




1615












  • Add docstrings and typed arguments. Otherwise it's not bad
    – Reinderien
    43 mins ago










  • A pity the code presented is uncommented but for a cryptic this takes more space than allowed - extra constraint(s)? (There's more than one error in I take this anwser as a referenced..)
    – greybeard
    35 mins ago


















  • Add docstrings and typed arguments. Otherwise it's not bad
    – Reinderien
    43 mins ago










  • A pity the code presented is uncommented but for a cryptic this takes more space than allowed - extra constraint(s)? (There's more than one error in I take this anwser as a referenced..)
    – greybeard
    35 mins ago
















Add docstrings and typed arguments. Otherwise it's not bad
– Reinderien
43 mins ago




Add docstrings and typed arguments. Otherwise it's not bad
– Reinderien
43 mins ago












A pity the code presented is uncommented but for a cryptic this takes more space than allowed - extra constraint(s)? (There's more than one error in I take this anwser as a referenced..)
– greybeard
35 mins ago




A pity the code presented is uncommented but for a cryptic this takes more space than allowed - extra constraint(s)? (There's more than one error in I take this anwser as a referenced..)
– greybeard
35 mins ago















active

oldest

votes











Your Answer





StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");

StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210315%2fnatural-merge-mergesort-that-uses-already-sorted-subarrays%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Code Review Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210315%2fnatural-merge-mergesort-that-uses-already-sorted-subarrays%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

404 Error Contact Form 7 ajax form submitting

How to know if a Active Directory user can login interactively

Refactoring coordinates for Minecraft Pi buildings written in Python