排序之归并排序(递归)
归并排序:(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
![](https://img2018.cnblogs.com/blog/1485478/201903/1485478-20190313204850097-1736084982.png)
测试代码:
public class Myguibing {
//排序函数
public static void merge(int[]a,int first,int mid,int last,int[]x)
{
int i=first;
int m=mid;
int j=mid+1;
int n=last;
int xi=0;//暂时存放数组
while(i<=m&&j<=n)
{
if(a[i]<=a[j])
x[xi++]=a[i++];
else
x[xi++]=a[j++];
}
while(i<=m)x[xi++]=a[i++];
while(j<=n)x[xi++]=a[j++];
for(i=0;i<xi;i++) a[first+i]=x[i];
}
//递归的把数组划分为两个子数组,一直递归到数组中只有一个元素
static void diguisort(int a[],int first,int last,int xi[])
{
if(first<last)//设置递归出口
{
int mid=(first+last)/2;
diguisort(a,first,mid,xi);//左边
diguisort(a,mid+1,last,xi);//右边
merge(a,first,mid,last,xi);//调用归并排序函数,两个有序数组排序import java.util.Scanner;
}
}
public void sort(int[] a) {
int n=a.length;
int[] b=new int[n];
diguisort(a, 0, n-1, b);
}
public static void main(String[] args) {
int[] a= {10,9,8,35,6,39,47,3};
int[] b= {12,39,83,325,62,392,417,23};
Myguibing p1=new Myguibing();
p1.sort(a);
p1.sort(b);
System.out.println("输入数组经排序后为:");
for (int i : b)
{
System.out.print(i+" ");
}
}