归并排序
/* without malloc error check */
void Merge(int *sequence, int *tmpsequence, int leftbegin, int center, int rightend)
{
int i, recordleft, leftend, rightbegin;
i = recordleft = leftbegin;
leftend = center;
rightbegin = center + 1;
while(leftbegin <= leftend && rightbegin <= rightend) {
if(sequence[leftbegin] < sequence[rightbegin])
tmpsequence[i++] = sequence[leftbegin++];
else
tmpsequence[i++] = sequence[rightbegin++];
}
while(leftbegin <= leftend)
tmpsequence[i++] = sequence[leftbegin++];
while(rightbegin <= rightend)
tmpsequence[i++] = sequence[rightbegin++];
for(i = recordleft; i <= rightend; i++)
sequence[i] = tmpsequence[i];
}
void MSort(int *sequence, int *tmpsequence, int left, int right)
{
int center;
if(left < right) {
center = (left + right) / 2;
MSort(sequence, tmpsequence, left, center);
MSort(sequence, tmpsequence, center+1, right);
Merge(sequence, tmpsequence, left, center, right);
}
}
void Merge_Sort(int *sequence, int n)
{
int *tmpsequence;
tmpsequence = (int*)malloc(sizeof(int) * n);
MSort(sequence, tmpsequence, 0, n-1);
free(tmpsequence);
}