Mình viết hàm Merge_Sort, nếu sử dụng hàm Merge tự viết như sau thì code chạy đúng:
#include <iostream>
#include <algorithm>
using namespace std;
template <typename T>
void merge(T *RES, int left, int m, int right)
{
int i, j;
T *WORK = new T[right + 1];
for (i = m + 1; i left; i--)
{
WORK[i - 1] = RES[i - 1];
}
for (j = m; j < right; j++)
{
WORK[right + m - j] = RES[j + 1];
}
for (int k = left; k <= right; k++)
if (WORK[j] < WORK[i])
RES[k] = WORK[j--];
else RES[k] = WORK[i++];
delete[] WORK;
}
template <typename T>
void mergesort(T *RES, int left, int right)
{
if (left < right)
{
int m = left + (right - left) / 2;
mergesort(RES, left, m);
mergesort(RES, m + 1, right);
merge(RES , left, m , right);
}
}
template <typename T>
void print(T* RES, int right)
{
for (int i=0; i < right; i++)
{
cout << RES[i] << ";";
}
}
void main()
{
char d[] = { 'e', 'a', 's','y','q','u','e','s','t','i','o','n' };
int size = sizeof(d)/sizeof(char);
mergesort(d, 0, size-1);
print(d, 12);
}
Nhưng nếu mình sử dụng hàm inplace_merge()
, về lý thuyết giống như hàm merge bên trên, thì code lại chạy sai.
template <typename T>
void mergesort(T *RES, int left, int right)
{
if (left < right)
{
int m = left + (right - left) / 2;
mergesort(RES, left, m);
mergesort(RES, m + 1, right);
inplace_merge(RES + left , RES+ m , RES+ right);
}
}
template <typename T>
void print(T* RES, int right)
{
for (int i=0; i < right; i++)
{
cout << RES[i] << ";";
}
}
void main()
{
char d[] = { 'e', 'a', 's','y','q','u','e','s','t','i','o','n' };
int size = sizeof(d)/sizeof(char);
mergesort(d, 0, size-1);
print(d, 12);
}
Ai giải thích giúp mình đc ko ạ?
[UPDATE] Sau khi mình sửa thành
inplace_merge(RES + left , RES+ m +1 , RES+ right +1);
thì code đã chạy. Xin cảm ơn.