归并排序:通过将两个或两个以上的有序表组合成一个新的有序表这一思想进行排序。
思路:假设初始序列含有n个记录,每个记录长度为1,通过归并合并成[n/2]个长度为2或1的有序序列;如此重复进行归并,到最后就可以得到一个长度为n的有序序列。
代码及注释如下:
void Merge(int *data, int p, int q, int r) //对数组进行归并
{
int leftnum, rightnum, i, j, k;
int *left = NULL, *right = NULL;
leftnum = q - p + 1; //确定数组分割点m左方元素的个数
rightnum = r - q; //确定数组分割点m右方元素的个数
//给指针分配所要存放的元素的个数大小的内存
left = new int[sizeof(int)*(leftnum)];
right = new int[sizeof(int)*(rightnum)];
for (i = 0; i < leftnum; i++) //对左数组赋值
{
left[i] = data[p + i];
}
for (j = 0; j < rightnum; j++) //对右数组赋值
{
right[j] = data[q + 1 + j];
}
/*重置计数值*/
i=0;
j=0;
k = p;
while (i<leftnum&&j<rightnum) //将数组元素值两两比较,并合并到data数组
{
if (left[i] <= right[j])
{
data[k] = left[i];
k++;
i++;
}
else
{
data[k] = right[j];
k++;
j++;
}
}
while(i < leftnum) //如果左数组有元素剩余,则将剩余元素合并到data数组
{
data[k] = left[i];
k++;
i++;
}
while(j < rightnum) //如果右数组有元素剩余,则将剩余元素合并到data数组
{
data[k] = right[j];
k++;
j++;
}
}
void MSort(int SR[], int s, int t) <span style="white-space:pre"> </span>//对数组进行归并排序
{
int m;
if (s<t) //如果数组下标s<t,则表示数组可以进行归并排序
{
m = (s + t) / 2; <span style="white-space:pre"> </span>//将数组平分为SR[s···m],SR[m+1···t]
MSort(SR,s, m); <span style="white-space:pre"> </span>//对数组SR[s···m]进行归并排序
MSort(SR,m + 1, t); <span style="white-space:pre"> </span>//对数组SR[m+1···t]进行归并排序
Merge(SR, s, m, t); <span style="white-space:pre"> </span>//将数组SR[s···m],SR[m+1···t]归并到SR[s···t]
}<span style="white-space:pre"> </span>
}
void MergeSort(int src[],int len)
{
MSort(src, 0, len-1); <span style="white-space:pre"> </span>//调用数组归并函数,数组长度为len,范围为0~len-1
}