📅  最后修改于: 2023-12-03 14:57:58.200000             🧑  作者: Mango
迭代合并排序(Iterative Merge Sort)是一种排序算法,它采用了分治策略来实现排序。与递归合并排序不同,迭代合并排序采用迭代的方法来实现分治,消除了递归的额外开销,提高了性能。
def merge_sort(arr):
n = len(arr)
curr_size = 1
while curr_size < n:
for left in range(0, n-1, curr_size*2):
mid = left + curr_size - 1
right = min(left + curr_size*2 - 1, n-1)
merge(arr, left, mid, right)
curr_size *= 2
def merge(arr, left, mid, right):
n1 = mid - left + 1
n2 = right - mid
L = [arr[left + i] for i in range(n1)]
R = [arr[mid + i + 1] for i in range(n2)]
i = j = 0
k = left
while i < n1 and j < n2:
if L[i] <= R[j]:
arr[k] = L[i]
i += 1
else:
arr[k] = R[j]
j += 1
k += 1
while i < n1:
arr[k] = L[i]
i += 1
k += 1
while j < n2:
arr[k] = R[j]
j += 1
k += 1
该函数包括两个参数:待排序数组arr和数组长度n。该函数使用了while循环,每次将迭代尺寸curr_size乘以2进行迭代。左起点从0开始,右终点为n-1。
def merge_sort(arr):
n = len(arr)
curr_size = 1
while curr_size < n:
for left in range(0, n-1, curr_size*2):
mid = left + curr_size - 1
right = min(left + curr_size*2 - 1, n-1)
merge(arr, left, mid, right)
curr_size *= 2
该函数包括四个参数:待排序数组arr、左起点left、中间点mid和右终点right。该函数主要用于对数组中的两个子数组进行合并,其中左边的子数组被认为是arr[left....mid],右边的子数组被认为是arr[mid+1....right]。
该函数首先计算出两个子数组的长度n1和n2,并创建两个数组L和R来存储分别对应的子数组。然后该函数使用while循环来比较L和R数组中的元素,并将较小的元素置于arr数组中。
最后,该函数将任何未被合并的元素依次放入arr数组中并返回该数组。
def merge(arr, left, mid, right):
n1 = mid - left + 1
n2 = right - mid
L = [arr[left + i] for i in range(n1)]
R = [arr[mid + i + 1] for i in range(n2)]
i = j = 0
k = left
while i < n1 and j < n2:
if L[i] <= R[j]:
arr[k] = L[i]
i += 1
else:
arr[k] = R[j]
j += 1
k += 1
while i < n1:
arr[k] = L[i]
i += 1
k += 1
while j < n2:
arr[k] = R[j]
j += 1
k += 1
迭代合并排序是一种高效的排序算法,避免了递归带来的性能问题。该算法的核心思想是分治策略,通过将数组分成多个子数组,然后对子数组进行内部排序,最后再合并这些子数组。