您的位置:首页 > 其它

算法导论----<归并排序>及实例

2016-04-05 13:15 363 查看
/*

MERGE(A,p,q,r)

n1 = q - p + 1

n2 = r - q

let L[1..n1 + 1] and R[1..n2+1] be new arrays

for i = 1 to n1

L[i] = A[p + i - 1]

for j = 1 to n2

R[j] = A[q+j]

L[n1 + 1] = S

R[n2 + 1] = S

i = 1

j = 1

for k = p to r

if L[i] <= R[j]

A[k] = L[i]

i = i + 1

else A[k] = R[j]

j = j + 1

*/

#include <iostream>

#include <string.h>

using namespace std;

int i,j,k;

int A[10];

void merge(int *A,int p,int q,int r)

{

int n1 = q - p +1;

int n2 = r - q;

int *L = new int[n1+1];

int *R = new int[n2+1];

for(i = 0;i<n1;i++){

*(L+i) = *(A+p+i);

}

//哨兵元素

*(L+n1) = 1000000;

for(i = 0;i<n2;i++){

*(R+i) = *(A+q+i+1);

}

*(R+n2) = 1000000;

i = 0;

j = 0;

for(k = p;k<=r;k++)

{

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

{

A[k] = L[i];

i++;

}

else

{

A[k] = R[j];

j++;

}

}

delete []L;

delete []R;

}

void mergesort(int *A,int p,int r)

{

int q;

if(p < r)

{

q = (p+r) / 2;

mergesort(A,p,q);

mergesort(A,q+1,r);

merge(A,p,q,r);

}

}

int main(){

for(i = 0;i<sizeof(A)/sizeof(A[0]);i++){

cin>>A[i];

}

mergesort(A,0,9);

for(i = 0;i<sizeof(A)/sizeof(A[0]);i++){

cout<<A[i]<<" ";

}

}

时间复杂度都是O(nlogn),空间复杂度是O(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: