归并排序也是经常用到的排序方式之一了,速度很快,能够达到O(n logn)的级别。
总的来说,归并排序首先通过递归方法将一组数据两两分开,将两个数据按顺序排列好,然后,递归到上一层,将先前排列好的数据,再合并到一个数组里面。依次往上层递归,最终能够达到数组的排序。上一张图,解释归并排序的整个排序流程。此图从互联网得。
从图中可以清晰的看出归并排序的流程。就不做过多解释了,一开始,看到这种思路觉得这种想法很难理解,跟我们平常使用的选择排序啊,冒泡排序啊等等,完全不同。而且,对于递归算法来说,有时候会让我不清楚算法的执行顺序,看完归并排序,不仅使我掌握了一个非常牛逼的算法,而且,我对递归算法的认识也更深刻了。
//归并排序
public class Merge {
public void MergeSort(int []data,int left,int mid,int right){
int third=left;
int[] tempArr=new int[data.length];
int center=mid+1;
int temp=left;
while(left<=mid&¢er<=right){
if(data[left]<=data[center]){
tempArr[third++]=data[left++];
}else{
tempArr[third++]=data[center++];
}
}
while(left<=mid){
tempArr[third++]=data[left++];
}
while(center<=right){
tempArr[third++]=data[center++];
}
while(temp<=right){
data[temp]=tempArr[temp++];
}
}
public int[] sort(int[] data,int left,int right){
if(left>=right)
return null;
int mid=(left+right)/2;
sort(data,left,mid);
sort(data,mid+1,right);
MergeSort(data, left,mid ,right);
return data;
}
public static void main(String[] args) {
int [] array=new int[]{2,6,8,1,3,9,4};
Merge m=new Merge();
int[] newarray=m.sort(array,0,array.length-1);
for(int i=0;i<newarray.length;i++){
System.out.println(newarray[i]);
}
}
}
以上就是完整的代码。可以自行试试。