[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [HELP]:Non-recursive merge sort
Hi ba'c Linh, non-recursive merge sort source code is included below
It's written in C, and thus can be easily converted into Pascal :-)
Best Regards,
Hu+ng
--------------------------------------------------------------
If we knew what it was we were doing, it would not be called
research, would it ?
--Albert Eistein
--------------------------------------------------------------
void MergeSort(ElementType *A, int N)
{
ElementType *Target, *Tmp;
int L, K, targetIndex, size;
Target = (ElementType *)malloc(sizeof(ElementType) * N);
if (Target == NULL)
{
perror("Out of memory.\n");
exit(1);
}
for (size = 1; size < N; size *= 2)
{
for (targetIndex = 0, lowIndex = 0; lowIndex < (N-1);
lowIndex += size * 2, targetIndex += size * 2)
{
highIndex = lowIndex + size;
if (highIndex > (N-1))
{
while (lowIndex <= (N-1))
{
Target[targetIndex] = A[lowIndex];
targetIndex++;
lowIndex++;
}
}
else
{
if ((highIndex + size) > (N-1))
Merge(A, lowIndex, highIndex, highIndex, (N-1), Target,
targetIndex);
else
Merge(A, lowIndex, highIndex, highIndex,
(highIndex + size), Target, targetIndex);
}
}
/* Swap Array and Target pointers */
Tmp = A;
A = Target;
Target = Tmp;
}
}
void Merge(ElementType A[], int index1, int end1, int index2, int end2,
ElementType Target[], int index3)
{
while (index1 < end1 && index2 < end2)
{
if (A[index1] <= A[index2])
{
Target[index3] = A[index1];
index1++;
}
else
{
Target[index3] = A[index2];
index2++;
}
index3++;
}
while (index1 < end1)
{
Target[index3] = A[index1];
index1++;
index3++;
}
while (index2 < end2)
{
Target[index3] = A[index2];
index2++;
index3++;
}
}