一、归并排序的思想
归并排序也是采用分治的策略。
分:数据划分成一个个的小组,使得组内有序。
合:小组进行归并,归并后的小组组内有序。
它的原理是:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/21] ([x]表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,…如此重复,直至得到-一个长度为n的有序序列为止,这种排序方法称为2路归并排序。
二、图解归并排序
我们给定待排序序列
[15 3 2 43 46 75 12 4 235 45 7 6]
归并排序如下图所示:
三、代码实现
void Merge(int arr[],int tmp[],int start,int mid,int end)
{
int i = start;//i标识左小组的第一个位置
int j = mid + 1;//j标识右小组的第一个位置
int k = start;//tmp中当前区域排序存放的起始位置
while(i < mid + 1 && j < end + 1)
{
if(arr[i] <= arr[j])
{
tmp[k++] = arr[i++];
}
else
{
tmp[k++] = arr[j++];
}
}
while(j < end + 1)//右边小组没有越界
{
tmp[k++] = arr[j++];
}
while(i < mid + 1)//左边小组没有越界
{
tmp[k++] = arr[i++];
}
for(int i = start; i <= end; i++)
{
arr[i] = arr[i];
}
}
void Merges(int arr[], int tmp[], int startindex, int endindex)
{
if(startindex < endindex)
{
int midindex = (startindex + endindex) / 2;
Merges(arr, tmp, startindex, midindex);
Merges(arr, tmp, midindex + 1. endindex );
Merges(arr, tmp, startindex, midindex, endindex);
}
}
void Mergesort(int arr[], int len)
{
int* tmp = (int*)malloc(sizeof(int)*len);
Merges(arr, tmp, 0, len - 1);
free(tmp);
}