如何实现合并两个已排序字符串数组时同步排序的归并算法?
嘿,我来帮你搞定这个两个已排序字符串数组的合并问题!
你已经用冒泡排序把两个数组分别排好序了,接下来要做的其实就是归并排序里的核心合并步骤——这个逻辑专门用来处理两个已排序数组的合并,效率高还不容易出错,完全不用再折腾同步排序那一套。
核心思路
归并合并的逻辑很简单:用两个指针分别盯着两个已排序数组的起始位置,每次对比两个指针指向的元素,把按字母顺序更小的那个放到结果数组里,然后移动对应的指针。等其中一个数组的元素全部处理完,直接把另一个数组剩下的元素追加到结果里就行(因为剩下的元素本身已经是有序的,而且肯定比之前加进去的都大)。
代码实现(以Python为例)
先确认你的冒泡排序是正常工作的(这里给个标准实现参考):
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # 每次冒泡把最大的元素移到末尾 for j in range(0, n - i - 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] swapped = True # 如果一轮没交换,说明已经有序,提前结束 if not swapped: break return arr
然后是关键的合并函数:
def merge_sorted_strings(arr1, arr2): merged_result = [] i = j = 0 # 两个指针分别指向arr1和arr2的起始位置 # 同时遍历两个数组,选较小的元素加入结果 while i < len(arr1) and j < len(arr2): # 字符串直接用<比较就是按字母顺序(ASCII码) if arr1[i] < arr2[j]: merged_result.append(arr1[i]) i += 1 else: merged_result.append(arr2[j]) j += 1 # 处理其中一个数组剩下的所有元素 merged_result.extend(arr1[i:]) merged_result.extend(arr2[j:]) return merged_result
测试一下
用你的场景跑一遍示例:
# 你的两个未排序输入列表 list1 = ["banana", "apple", "cherry"] list2 = ["date", "blueberry", "elderberry"] # 先分别排序 sorted_list1 = bubble_sort(list1) sorted_list2 = bubble_sort(list2) # 合并成整体有序的数组 final_sorted_array = merge_sorted_strings(sorted_list1, sorted_list2) print(final_sorted_array)
输出结果会是:
['apple', 'banana', 'blueberry', 'cherry', 'date', 'elderberry']
为啥之前的尝试没效果?
你之前想在合并时同步排序,大概率是把两个数组直接拼起来再排序,这样虽然能得到结果,但时间复杂度更高(O((m+n)log(m+n))),而用归并合并的方法时间复杂度是O(m+n),效率提升很明显,尤其是数组元素多的时候。而且这种双指针的逻辑逻辑清晰,不容易出bug。
内容的提问来源于stack exchange,提问作者love2code
相关产品推荐
相关产品推荐

