原地归并排序不占用额外空间
import time
import random
def inverse(s, start, end):
i = start
j = end
while(i < j):
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
def inPlaceMerge(s, aStart, aEnd, bStart, bEnd):
i = aStart
j = bStart
while(i <= aEnd and j <= bEnd):
bStart = j
while(i <= aEnd and s[i] <= s[j]):
i += 1
while(j <= bEnd and s[j] <= s[i]):
j += 1
inverse(s, i, aEnd)
inverse(s, bStart, j - 1)
inverse(s, i, j - 1 )
aEnd =aEnd + j - bStart
bStart =j
i = i + j - bStart
return s
def inPlaceDivide(s, start, end):
if end - start < 1:
return s
mid = (start + end)//2
inPlaceDivide(s, start, mid)
inPlaceDivide(s, mid+1, end)
s = inPlaceMerge(s, start, mid, mid+1, end)
return s
def originalMerge(s, aStart, aEnd, bStart, bEnd):
a = []
i = aStart
j = bStart
while i <= aEnd and j <= bEnd:
while(i <= aEnd and s[i] <= s[j]):
a.append(s[i])
i += 1
while(j <= bEnd and s[j] <= s[i]):
a.append(s[j])
j += 1
if i <= aEnd:
a += s[i:aEnd+1]
if j <= bEnd:
a += s[j:bEnd+1]
s[aStart:bEnd+1] = a
return s
def originalDivide(s, start, end):
if end - start < 1:
return s
mid = (start + end)//2
originalDivide(s, start, mid)
originalDivide(s, mid+1, end)
s = originalMerge(s, start, mid, mid+1, end)
return s
def quickSort(s, start, end):
if end - start <= 0:
return s
select = random.randint(start, end)
s[start], s[select] = s[select], s[start]
x = s[start]
i = start + 1
j = i
while j <= end:
while i <= end and s[i] <= x:
i += 1
j = i
while j <= end and s[j] >= x:
j += 1
if i > end:
i = end + 1
break
if i <= end and j <= end:
s[i], s[j] = s[j], s[i]
s[i-1], s[start] = s[start], s[i-1]
quickSort(s, start, i-2)
quickSort(s, i , end)
return s
randList = [random.randint(0, 1000) for i in range(10000)]
#print(randList)
#print("列表元素个数" + str(len(randList)) + ";列表随机数范围0-1000000")
s = [4,5,7,6,4,7,5,6]
start = time.process_time()
s = inPlaceDivide(s, 0, len(s)-1)
end = time.process_time() - start
print("inPlaceMerge消耗时间"+str(end))
print(s)
s = randList
start = time.process_time()
#s = originalDivide(s, 0, len(s)-1)
end = time.process_time() - start
print("originalMerge消耗时间"+str(end))
#print(s)
s = randList
start = time.process_time()
#s = quickSort(s, 0, len(s)-1)
end = time.process_time() - start
print("quickSort消耗时间"+str(end))
#print(s)