这是一个归并排序,是根据<算法导论第三版> 的伪代码写的,可是最终得到的结果总是错误的,不知道怎么回事总会访问到特定的数组外但是也没有发生编译过程的错误.
#include
using namespace std;
void Merge(int *A,int p,int q,int r)
{
int n1 = q - p;
int n2 = r - q;
cout << "q-p=" << q - p << endl;
int* L = new int[n1+1];
int* R = new int[n2];
for (int i = 0; i <= n1; i++)
{
L[i] = A[p + i];
}
for (int j = 0; j < n2; j++)
{
R[j] = A[q + j + 1];
}
int i = 0;
int j = 0;
for (int k = p; k < r; k++)
{
if (L[i] <= R[j])
{
A[k] = L[i];
i++;
}
else
{
A[k] = R[j];
j++;
}
}
}
void Merge_Sort(int* A, int low, int high)
{
int mid;
if (low < high)
{
mid = ((low + high) / 2);
Merge_Sort(A, low, mid);
Merge_Sort(A, mid + 1, high);
Merge(A, low, mid, high);
}
}
int main()
{
int A[10] = {10,9,8,7,6,5,4,3,2,1};
int low = 0;
int high = 9;
int mid = (low + high) / 2;
Merge(A, low, mid, high);
Merge_Sort(A, 0, 9);
for (int m = 0; m < 10; m++)
{
cout << A[m] << " ";
}
cout << endl;
return 0;
}
你的merge代码没有考虑left和right数组元素数目不等的情况。
#include <iostream>
using namespace std;
void Merge(int *A, int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int *L = new int[n1];
int *R = new int[n2];
for (int i = 0; i < n1; i++)
L[i] = A[p + i];
for (int j = 0; j < n2; j++)
R[j] = A[q + j + 1];
int i = 0;
int j = 0;
int k = p;
// Merge L[] and R[] into A[]
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
A[k++] = L[i++];
else
A[k++] = R[j++];
}
// Copy the remaining element of L[], if there are any
while (i < n1)
A[k++] = L[i++];
// Copy the remaining element of R[], if there are any
while (j < n2)
A[k++] = R[j++];
delete[] L;
delete[] R;
}
void Merge_Sort(int *A, int low, int high)
{
int mid;
if (low < high)
{
mid = (low + high) / 2;
Merge_Sort(A, low, mid);
Merge_Sort(A, mid + 1, high);
Merge(A, low, mid, high);
}
}
int main()
{
int A[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int low = 0;
int high = 9;
int mid = (low + high) / 2;
Merge(A, low, mid, high);
Merge_Sort(A, 0, 9);
for (int m = 0; m < 10; m++)
{
cout << A[m] << " ";
}
cout << endl;
return 0;
}
#include <iostream>
using namespace std;
void Merge(int *A, int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int *L = new int[n1];
int *R = new int[n2];
for (int i = 0; i < n1; i++)
L[i] = A[p + i];
for (int j = 0; j < n2; j++)
R[j] = A[q + j + 1];
int i = 0;
int j = 0;
int k = p;
// Merge L[] and R[] into A[]
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
A[k++] = L[i++];
else
A[k++] = R[j++];
}
// Copy the remaining element of L[], if there are any
while (i < n1)
A[k++] = L[i++];
// Copy the remaining element of R[], if there are any
while (j < n2)
A[k++] = R[j++];
delete[] L;
delete[] R;
}
void Merge_Sort(int *A, int low, int high)
{
int mid;
if (low < high)
{
mid = (low + high) / 2;
Merge_Sort(A, low, mid);
Merge_Sort(A, mid + 1, high);
Merge(A, low, mid, high);
}
}
int main()
{
int A[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int low = 0;
int high = 9;
int mid = (low + high) / 2;
Merge(A, low, mid, high);
Merge_Sort(A, 0, 9);
for (int m = 0; m < 10; m++)
{
cout << A[m] << " ";
}
cout << endl;
return 0;
}
这样就可以了~