Merge_sort sử dụng algorithm merge() của thư viện STL

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.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?