You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:04:17