归并排序

来源:互联网 发布:mac能下qq游戏吗 编辑:程序博客网 时间:2024/06/04 04:10

归并排序:(算法伪代码实现可看《算法导论》第三版)

1.      操作

(1)      分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列

(2)      解决:使用归并排序递归地排序两个子序列

(3)      合并:合并两个已排序的子序列以产生已排序的答案

2.      代码

#include<iostream>

#include<vector>

usingnamespace std;

 

vector<int>MERGE(vector<int>&A,int p, int q, int r)

{

         vector<int>L(A.begin()+p-1 ,A.begin() + q);

         vector<int>R(A.begin()+q ,A.begin() + r );

         int i = 0;

         int j = 0;

         for(int k = p-1; k < r; ++k)

         {

                   if((i < q-p+1)&&(j< r-q))

                   {

                            if(L[i] <= R[j])

                            {

                                     A[k] =L[i];

                                     i = i + 1;

                            }

                            else

                            {

                                     A[k] =R[j];

                                     j = j + 1;

                            }

                   }

                   else

                   {

                            if( i < q - p+1)

                            {

                                     A[k] =L[i];

                                     i = i + 1;

                            }

                            else

                            {

                                     A[k] =R[j];

                                     j = j + 1;

                            }

                   }

         }

         return A;

}

vector<int>MERGE_SORT(vector<int>&A ,int p, int r)

{

         if(p<r)

         {

                   int q = (p + r)/2;

                   MERGE_SORT(A,p,q);

                   MERGE_SORT(A,q+1,r);

                   MERGE(A,p,q,r);

         }

         return A;

}

 

intmain()

{

         int a[] = {4,5,2,0,100,7,8,29,4,6,5,3};

         vector<int>b(a, a+12);

         MERGE_SORT(b,1,12);

         for(int i = 0 ; i < b.size(); ++i)

                   cout << b[i] <<ends;

         cout << endl;

         return 0;

}

 

3.运行时间:

(1)MERGE的运行时间的增长率是:n,其中n = r- p +1;

(2)归并算法的运行时间的增长率是:nlgn;


4.应用:逆序对

假设A[1..n]是一个有n个不同数的数组。若i<j且A[i]>A[j],则对偶(i,j)称为A的一个逆序对,求数组的逆序对。

 

代码实现:

#include<iostream>

#include<vector>

using namespace std;

 

vector<int> MERGE(vector<int>&A,int p, int q, int r)

{

vector<int>L(A.begin()+p-1, A.begin() + q);

vector<int>R(A.begin()+q, A.begin() + r );

int i = 0;

int j = 0;

for(int k = p-1; k < r;++k)

{

           if((i <q-p+1)&&(j < r-q))

           {

                    if(L[i]<= R[j])

                    {

                             A[k]= L[i];

                             i= i + 1;

                    }

                    else

                    {

                             A[k]= R[j];

                             for(intz = i; z < L.size(); ++z)

                                       cout<< "逆序对是: " << L[z] <<ends << R[j] << endl;

                             j= j + 1;

                    }

           }

           else

           {

                    if( i <q - p+1)

                    {

                             A[k]= L[i];

                             i= i + 1;

                    }

                    else

                    {

                             A[k]= R[j];

                             j= j + 1;

                    }

           }

}

return A;

}

vector<int> MERGE_SORT(vector<int>&A ,int p, int r)

{

if(p<r)

{

           int q = (p + r)/2;

           MERGE_SORT(A,p,q);

           MERGE_SORT(A,q+1,r);

           MERGE(A,p,q,r);

}

return A;

}

 

int main()

{

int a[] = {2,3,8,6,1,0,9,5};

vector<int>b(a, a+8);

MERGE_SORT(b,1,8);

return 0;

}


 

 

0 0
原创粉丝点击