数据结构-排序-归并排序

 

                归并排序

  • 什么事归并排序??就是把几个有序序列合并
  •  先讲简单的2个有序的归并排序
  • 思路很简单,不停的比较两个数组的第一个,谁大就把它插入第三方数组,然后下标++,当某一数组遍历完了,直接把另一个数组剩下的值插入即可。
  • void two_sort(const vector<int>& v1,const vector<int>& v2,vecotr<int>& v3)
    {
        int i=0,j=0,k=0;
        while(i<v1.size()&&j<v2.size())
        {
            if(v1[i]<v2[j])
               v3.push_back(v1[i++])else
               v3.push_back(v2[j++]);
        }
     if(i<v1.size())
        {
        while(i<v1.size())
            v3.push_back(v1[i++]);
       }
       else
      {
        while(j<v2.size())
            v3.push_back(v2[j++]);
      }
    }

    理解了这个归并排序那么真正的归并排序也非常简单了。

  • 直接上代码
  • /一次归并排序,两个有序序列分别为v[s]~v[m],v[m+1]~v[t],这里把v1看作两个有序列
    void Merge(vector<int>& v1,int first,int mide,int last,vector<int>& v2)
    {
        int i=first,j=mide+1;
        while(i<=mide&&j<=last)
        {
            if(v1[i]<v1[j])
               v2.push_back(v1[i++]);
            else
               v2.push_back(v1[j++]);
        }
            if(i<mide)
        {
        while(i<mide)
            v2.push_back(v1[i++]);
       }
       else
      {
        while(j<last)
            v2.push_back(v1[j++]);
      }
        for(int i=0;i<last;i++)
            v1[i]=v2[i];
    }
    //归并排序递归
    void mergesort(vector<int>&v1, int first, int last, vector<int>&v2)
    {
        if (first < last)           //当first和last相等时候退出循环
        {
            int mid = (first + last) / 2;
            mergesort(v1, first, mid, v2);    //左边有序
            mergesort(v1, mid + 1, last, v2); //右边有序
            Merge(v1, first, mid, last, v2); //再将二个有序数列合并
        }
    }

     

 

posted on 2018-05-21 22:54  邓佳程  阅读(185)  评论(0编辑  收藏  举报

导航