归并排序:采用的是一种分而治之的思想.
过程:将一个数组进行二分,直到有每组有一个元素为止.然后进行合并元素,按照一定的顺序进行排序.
代码实现:
①:递归实现
void Merge(int arr[],int left,int mid,int right,int tmp[])
{
if(right - left <= 1)
{
return;
}
int start = left;
int end = mid;
int index = 0;
while(start < mid && end < right)
{
if(arr[start] < arr[end])
{
tmp[index++] = arr[start++];
}
else
{
tmp[index++] = arr[end++];
}
}
while(start < mid)
{
tmp[index++] = arr[start++];
}
while(end < right)
{
tmp[index++] = arr[end++];
}
memcpy(arr + left,tmp,sizeof(int)*(right - left));
}
void _MergeSort(int arr[],int left,int right,int tmp[])
{
if(right - left <= 1)
{
return;
}
int mid = left + (right - left)/2;
_MergeSort(arr,left,mid,tmp);
_MergeSort(arr,mid,right,tmp);
Merge(arr,left,mid,right,tmp);
}
//归并排序(递归)
void MergeSort(int arr[],int size)
{
if(size <= 1)
{
return;
}
int* tmp = (int*)malloc(sizeof(arr[0])*size);
_MergeSort(arr,0,size,tmp);
free(tmp);
}
②:非递归实现
void Merge(int arr[],int left,int mid,int right,int tmp[])
{
if(right - left <= 1)
{
return;
}
int start = left;
int end = mid;
int index = 0;
while(start < mid && end < right)
{
if(arr[start] < arr[end])
{
tmp[index++] = arr[start++];
}
else
{
tmp[index++] = arr[end++];
}
}
while(start < mid)
{
tmp[index++] = arr[start++];
}
while(end < right)
{
tmp[index++] = arr[end++];
}
memcpy(arr + left,tmp,sizeof(int)*(right - left));
}
//非递归
void MergeSortByLoop(int arr[],int size)
{
if(size <= 1)
{
return;
}
int gap = 1;
int* tmp = (int*)malloc(sizeof(arr[0])*size);
for(;gap < size;gap *= 2)
{
int i = 0;
for(; i < size;i += 2*gap)
{
int start = i;
int mid = gap + i;
int end = 2*gap + i;
if(mid > size)
{
mid = size;
}
if(end > size)
{
end = size;
}
Merge(arr,start,mid,end,tmp);
}
}
}