归并排序
归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。


归并排序先把每一个分开,然后在合并的时候排序
时间跟快速排序差不多
定义一个左指针一个右指针,一个中间变量,一个临时数组
分开后,对比两个合并,先存放小的,然后存大的,然后把剩下的存储进去
具体实现如下:
/**
*
* @param arr 原数组
* @param left 左边
* @param right 右边
* @param temp 临时存储数组
*/
//分与和
public static void MergeSort(int [] arr,int left,int right,int [] temp)
{
//当左指针小于右边的指针
if (left<right)
{
//中间的指针
int mid=(left+right)/2;
//向左递归
MergeSort(arr,left,mid,temp);
//向右递归
MergeSort(arr,mid+1,right,temp);
//合并
merge(arr,left,mid,right,temp);
}
}
/**
*
* @param arr 原数组
* @param left 左边
* @param mid 中间
* @param right 右边
* @param temp 临时存储数组
*/
//合并
public static void merge(int [] arr,int left,int mid,int right,int [] temp)
{
//定义左边的指针
int i=left;
//定义中间的指针
int j=mid+1;
//设置临时数组的指针
int t=0;
//当左边的指针小于中间的指针和右边的指针小于右边的指针
while (i<=mid&&j<=right)
{
//当左边小于右边时,把左边存储进去
if (arr[i]<=arr[j])
{
temp[t]=arr[i];
t+=1;
i+=1;
}else //否则存储右边进去
{
temp[t]=arr[j];
t+=1;
j+=1;
}
}
//当左边没有存储完,把剩下的存储进去
while (i<=mid)
{
temp[t]=arr[i];
t+=1;
i+=1;
}
//当右边没有存储完,把剩下的存储进去
while (j<=right)
{
temp[t]=arr[j];
t+=1;
j+=1;
}
//初始化
t=0;
//设置从左边开始存储
int templeft=left;
//当小于右边时,开始复制
while (templeft<=right)
{
arr[templeft]=temp[t];
t+=1;
templeft+=1;
}
}


浙公网安备 33010602011771号