归并排序 运行出来的结果,最后一个数没有进行合并排序

归并排序 运行出来的结果,最后一个数没有进行合并排序
(vs2017 C++)
代码如下

void merge_sort(vector<int> &nums,  int l,int r,vector<int>&temp) {
    if (l + 1 >= r) {
        return;
    }
    int m = l + (r - l) / 2;
    merge_sort(nums, l, m, temp);
    merge_sort(nums, m, r, temp);
    int p = l, q = m, i = l;
    cout << "i=" << i << endl;
    cout << "p=" << p << endl;
    while (p < m || q < r) {
        if (q >= r || (p < m &&nums[p] <= nums[q])) {
            temp[i++] = nums[p++];
        }
        else {
            temp[i++] = nums[q++];
        }
    }
    for (i = l; i <r; ++i) {
        nums[i] = temp[i];
    }
}
int main() {
    vector<int> nums{ 9,6,7,22,20,33,16,21 };
    vector<int> temp(nums.size());
    merge_sort(nums,0, nums.size() - 1,temp);
    for (int i = 0; i < nums.size(); i++) {
        cout << "nums[" << i << "]=" << nums[i] << endl;
    }
    return 0;
}

结果nums 为{6,7,9,16,20,22,33,21}
实际应为{6,7,9,16,20,22,21,33}

请参考这篇文章
归并排序C++实现(附完整可运行源代码)_热心码农小杨的博客-CSDN博客_归并排序c++ 归并排序(Merge sort)排序思想:将初始序列的n个元素看成n个有序的子序列,每个子序列中只有一个元素,将其两两归并,得到n/2个长度为2(或1、子序列不为偶数则有落单)的有序子序列,再两两归并…以此类推直到得到n长的有序序列。归并思想:两个子序列,分别有一个指针指向其首部,指针指向的元素进行对比,小的放入辅助数组里,指针后移,大的不动,直到两两对比完成,此时如果有某一子序列中的元素并没有对比完,则直接放入辅助数组。优缺点:效率高且稳定,但是消耗的辅助空间与原数据空间成正比。复杂度:时间复 https://blog.csdn.net/qq_43685399/article/details/106711042?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162937330016780357253200%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162937330016780357253200&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-106711042.first_rank_v2_pc_rank_v29&utm_term=%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8Fc%2B%2B&spm=1018.2226.3001.4187