归并排序
归并排序是一种通过递归,将数组进行划分,在进行排序,最后在归并在一起的算法。
该算法是采用分治法的一个非常典型的应用。
void meargeSort(int arr[],int head,int mid,int tail)
{
int i=head;
int j=mid+1;
int arr2[]; //这里是复制的临时数组
for(int k=i;k<tail;k++)
{
arr2[k]=arr[k]; //复制数据到arr2
}
for (int k=i;k<tail;k++)
{
if(i>mid)
{
arr[k]=arr2[j++]; //如果左边的数字已经被取完了,挨着挨着比较过后,剩下的数字一定左边的大,所以可以直接添加
}
else if(j>tail) //如果右边的数字已经取完了
{
arr[k]=arr2[i++];
}
else if(arr2[i]>arr2[j]) // 如果左边的比右边的小,就取左边的数字
{
arr[k]=arr2[j++];
}
else //如果右边的比左边的小,就取右边的数字
{
arr[k]=arr2[i++];
}
}
}
void sort(int arr[],int head,int tail)
{
if(head<=tail) //如果头比尾部小了,直接返回
{
return;
}
int mid=(head+tail)/2;
sort(arr,head,mid); //归并排序左边的数字
sort(arr,mid,tail); //归并排序右边的数字
meargeSort(arr,head,mid,tail);
}
通过递归调用,最后将会到两个数字进行交换,在逐步扩大到一半的数组,由于两两都是排序好了的,故可以通过 mearge的算法进行归并排序,依次慢慢返回,最后直到所有的数组都完成排序。