提问人:Talaal Bajwa 提问时间:9/6/2023 更新时间:9/24/2023 访问量:87
在 Python 中尝试混合排序算法(冒泡 + 合并排序)
Trying a Hybrid Sort Algorithm (Bubble + Merge Sort) in Python
问:
因此,我的任务是在 python 中创建一个混合排序函数,该函数将利用冒泡和合并排序。这个想法很简单;只要超过值 T(阈值),合并排序就应该递归运行,而当值小于或等于 T 时,就会调用冒泡排序。这略微优化了原始的合并排序功能。
这是我写的代码:
def bubbleSort(arr, l, h):
isSwapped = False
size = h - l
for i in range(size-1):
for j in range(0, size-i-1):
if arr[j] > arr[j + 1]:
isSwapped = True
arr[j], arr[j + 1] = arr[j + 1], arr[j]
if not isSwapped:
return
def merge(arr, l, m, r):
size1 = m - l + 1
size2 = r - m
l_arr = [0] * size1
r_arr = [0] * size2
for i in range(0, size1):
l_arr[i] = arr[l + i]
for j in range(0, size2):
r_arr[j] = arr[m + 1 + j]
# merge
i = 0
j = 0
k = l
while i < size1 and j < size2:
if l_arr[i] <= r_arr[j]:
arr[k] = l_arr[i]
i += 1
else:
arr[k] = r_arr[j]
j += 1
k += 1
while i < size1:
arr[k] = l_arr[i]
i += 1
k += 1
while j < size2:
arr[k] = r_arr[j]
j += 1
k += 1
def mergeSort(arr, l, r):
if l < r:
m = l + (r - l) // 2
mergeSort(arr, l, m)
mergeSort(arr, m + 1, r)
merge(arr, l, m, r)
else:
return
def hybridMergeSort(arr, l, r):
T = 16
while l < r:
if len(arr) <= T:
bubbleSort(arr, l, r)
break
else:
m = len(arr) // 2
hybridMergeSort(arr, l, m)
hybridMergeSort(arr, m + 1, r)
merge(arr, l, m, r)
类似的逻辑也适用于混合快速排序算法。我不知道问题出在哪里。它始终返回错误:RecursionError: maximum recursion depth exceeded。使用 mergeSort() 函数本身时,不会返回相同的错误。顺便说一句,我正在尝试将它们用于长度为 1000 的随机数组。我觉得递归的数量应该是一样的吗?
我错过了什么吗?
答:
0赞
chqrlie
9/24/2023
#1
代码中存在多个问题:
在:bubbleSort
您在内部循环中使用了错误的索引:您应该将索引范围移动 。
l
您应该重置为内循环之前,以尽快停止外循环。
isSwapped
False
由于 和 都包含,因此切片中的元素数为 ,因此范围相差 1。
l
h
h - l + 1
def bubbleSort(arr, l, h): for i in range(h - l): isSwapped = False for j in range(l, h-i-1): if arr[j] > arr[j + 1]: isSwapped = True arr[j], arr[j + 1] = arr[j + 1], arr[j] if not isSwapped: return
在:hybridMerge
while l < r:
不正确:它导致了无限循环,因为在循环体中既没有也没有修改。只需写l
r
if l < r:
测试不正确:应测试切片的长度是否小于或等于 ,即:如果小于:
if len(arr) <= T
T
h - l
T
if r - l < T
同样,中点必须从 和 计算,而不是从数组的长度计算。这就是无限递归的原因。
m
h
l
m = l + (r - l) // 2
这是一个修改后的版本:
def bubbleSort(arr, l, h):
for i in range(h - l):
isSwapped = False
for j in range(l, h-i-1):
if arr[j] > arr[j + 1]:
isSwapped = True
arr[j], arr[j + 1] = arr[j + 1], arr[j]
if not isSwapped:
return
def merge(arr, l, m, r):
size1 = m - l + 1
size2 = r - m
l_arr = arr[l : m+1]
r_arr = arr[m+1 : r]
# merge
i = 0
j = 0
k = l
while i < size1 and j < size2:
if l_arr[i] <= r_arr[j]:
arr[k] = l_arr[i]
i += 1
else:
arr[k] = r_arr[j]
j += 1
k += 1
while i < size1:
arr[k] = l_arr[i]
i += 1
k += 1
while j < size2:
arr[k] = r_arr[j]
j += 1
k += 1
def mergeSort(arr, l, r):
if l < r:
m = l + (r - l) // 2
mergeSort(arr, l, m)
mergeSort(arr, m + 1, r)
merge(arr, l, m, r)
else:
return
def hybridMergeSort(arr, l, r):
T = 16
if r - l < T:
if l < r:
bubbleSort(arr, l, r)
else:
m = l + (r - l) // 2
hybridMergeSort(arr, l, m)
hybridMergeSort(arr, m + 1, r)
merge(arr, l, m, r)
评论
hybridMergeSort(arr, l, m)
l
m = len(arr) // 2
len(arr)
(r - l + 1)