Source: Internet
Author: User

The subscript on the introduction of the algorithm starts from 1, but in order to be consistent with the design idea of the C + + STL, the realization of all functions is unified with left-right open interval. In the middle of a lot of changes, because the subscript modification is not easy to get rid of, you need to always maintain the cycle invariant, a slight error will make the result of some errors.

#include

#include

#include

#include

using namespace Std;

void merge (int *a, int p, int q, int r) {//merge [P, R), left close right open interval

int n1 = q-p, N2 = R-q; Note that the number of changes in the book and the difference between the use of left-right open interval is the advantage of a uniform number of form representation

int *l = new Int[n1], *r = new INT[N2];

for (int i = 0; i < N1 ++i)//l[0, N1) <== a[p, q)

L[i] = A[p+i];

for (int i = 0; i < n2 ++i)//r[0, N2) <== a[q, R)

R[i] = A[q+i]; It's not q+i+1 here.

int i = 0, j = 0;

int k = p;

while (I < N1 && J < N2) {

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

a[k++] = l[i++];

Else

a[k++] = r[j++];

}

while (I < N1)//due to the absence of Sentinels, additional elements need to be added

a[k++] = l[i++];

while (J < N2)

a[k++] = r[j++];

delete [] L;

delete [] R;

}

void Merge_sort (int *a, int p, int r) {//Call interface Merge_sort (A, 0, Len), not (a, 0, len-1)

if (P < r-1) {//At this time is not P < R, left closed right open interval when p>=r-1, the child array at most one element

int q = p + (r-p)/2;

Merge_sort (A, p, q);

Merge_sort (A, q, R); Note that the interface is unified, this is not (a, q+1, R) but (a, q, R), the benefits of left-right open

Merge (A, p, Q, R);

}

}

int main ()

{

Srand (Time (NULL));

int n;

while (CIN "n") {

int a[n];

for (int i = 0; i < n; ++i)

A[i] = rand ()% n;

for (int i = 0; i < n; ++i)

printf ("%d", a[i]);

printf ("n");

Merge_sort (A, 0, N);

for (int i = 0; i < n; ++i)

printf ("%d", a[i]);

printf ("n");

}

}

Finally, using tens of thousands of sets of test data, the results are similar to the STL in the sort results, the basic description of the code is correct.

Related Article