使用向量迭代器的合并矢量

MergeSort vectors using vector iterators

本文关键字:合并 迭代器 向量      更新时间:2023-10-16

我需要实现Mergesort使用向量迭代器对整数进行分类。我实现了它,但是我遇到了此错误:矢量迭代器不可用。

作为Mergesort函数i使用的参数(a.begin(),a.end()),其中a是我的向量,其中包含n元素。

#include <iostream>
#include <vector>
using namespace std;
void swap(vector<int>::iterator first,vector<int>::iterator last)
{
    int temp;
    temp=*first;
    *first=*last;
    *last=temp;
    return;
}

void mergesort(vector<int>::iterator first,vector<int>::iterator last)
{
    if(first==last) return; 
    if(first+1==last)  
    {
        if(*last>*first) swap(first,last);
        return;
    }
    vector<int>::iterator middle;
    middle=first+(last-first)/2;
    mergesort(first,middle);
    mergesort(middle+1,last);
    int a,b,pa,pb;
    vector<int> h;
        //the number of elements in a
    pa=middle-first+1; 
        //the number of elements in b
    pb=last-middle;    
         h.resize(pa+pb);
    a=0; b=0;
    while(a<pa && b<pb)
        if(*(first+a)<*(middle+1+b)) 
          {
              h[a+b]=*(first+a); a++;
          }
        else
          {
              h[a+b]=*(middle+1+b); b++;
          }
    while(a<pa) 
       {
           h[a+b]=*(first+a); a++;
       }
    while(b<pb)
       {
           h[a+b]=*(middle+1+b); b++;
       }
    for(int i=0;i<((a+b)-1);i++)
    *(first+i)=h[i];
    return;
}


int main(){
    vector<int>A;
    for(int i=1000;i>0;i--)
    {
        A.push_back(i);               
           //vector of integer: 1000,999,998 ... 3,2,1
    }
    mergesort(A.begin(),A.end());     
 //sort vector elements from smallest to biggest: 1,2,3...998,999,1000

    system("pause");
    return 0;
}

迭代器范围应表示为迭代器,涉及第一个元素,而迭代器则指代一past-the-end。如果它们是相等的,那么这是一个空范围。你不是那样做。

要解决此问题,if(first+1==last)子句应返回。第二个mergesort(middle+1,last)呼叫应为mergesort(middle,last)pa应仅等于middle-lastpb的计算正确。我认为最后一个循环中的-1应该被删除。

将迭代器定义为首先定义的范围,而迭代器则是一个坏主意。

你应该做

mergesort(A.begin(),A.end()-1); 

实际上, end()迭代器指向之后的元素。它没有指向向量的元素。