如何不使用sort函数先排序再合并不同长度向量?现有代码其余功能正常
解决不使用sort函数的向量排序与合并问题
嘿,我来帮你搞定这个问题!咱们把需求拆成两步:先给两个向量各自完成自定义排序(完全不用内置sort函数),再把排好序的两个向量合并成一个有序向量。一步步来,很容易搞定的。
第一步:实现自定义排序(以冒泡排序为例)
先给你说个最容易理解的排序算法——冒泡排序,完全不用依赖语言内置的sort方法。它的核心逻辑就是反复遍历向量,比较相邻元素,如果顺序不对就交换位置,直到整个向量变得有序。
比如针对一个向量vec,冒泡排序的Python代码可以这么写:
def custom_sort(vec): n = len(vec) # 遍历所有元素 for i in range(n): # 最后i个元素已经排好序了,不用再重复比较 swapped = False for j in range(0, n-i-1): # 如果当前元素比下一个大,交换两者位置 if vec[j] > vec[j+1]: vec[j], vec[j+1] = vec[j+1], vec[j] swapped = True # 如果这一轮遍历没有发生任何交换,说明向量已经有序,可以提前退出循环 if not swapped: break return vec
这里加了swapped标志做优化,能避免不必要的遍历,提升一点效率。当然你也可以换成选择排序、插入排序,逻辑大同小异,选你觉得顺手的就行。
第二步:合并两个已排序的向量
当两个向量都排好序之后,咱们用双指针法来合并,效率很高,时间复杂度是O(m+n)(m、n分别是两个向量的长度)。逻辑非常直观:
- 用两个指针分别指向两个向量的起始位置
- 每次比较两个指针指向的元素,把较小的那个加入结果向量,然后移动对应的指针
- 当其中一个向量遍历完之后,直接把另一个向量剩下的元素追加到结果里就好
合并的代码示例:
def merge_sorted_vectors(vec1, vec2): merged = [] i = j = 0 # 同时遍历两个有序向量 while i < len(vec1) and j < len(vec2): if vec1[i] <= vec2[j]: merged.append(vec1[i]) i += 1 else: merged.append(vec2[j]) j += 1 # 把其中一个向量剩下的元素全部追加到结果中 merged.extend(vec1[i:]) merged.extend(vec2[j:]) return merged
整合完整流程
把上面两个函数结合起来,先分别排序两个向量,再执行合并:
# 测试用例 vec_a = [3, 1, 4, 1, 5] vec_b = [9, 2, 6, 5, 3, 5] # 先对两个向量分别排序 sorted_a = custom_sort(vec_a) sorted_b = custom_sort(vec_b) # 合并两个有序向量 final_result = merge_sorted_vectors(sorted_a, sorted_b) print(final_result) # 输出:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
如果你用的是其他语言(比如C++、Java),核心逻辑也是完全一致的,只是语法上稍作调整就行。比如C++里用数组的话,把指针换成索引,合并的时候用vector存储结果即可。
要是你觉得冒泡排序的效率不够(比如处理特别大的向量),可以换成快速排序或者归并排序,但冒泡排序胜在简单易懂,非常适合入门调试。
内容的提问来源于stack exchange,提问作者Panalover297
相关产品推荐
相关产品推荐

