排序算法之归并排序

归并排序基本介绍

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

代码:

package com.gcy.sort;

import java.util.Arrays;

import javax.imageio.event.IIOReadWarningListener;

/**
* 归并排序
* @author Administrator
*
*/
public class MergetSort {

public static void main(String[] args) {
int[] arr= {8,4,5,7,1,3,6,2};
int[] temp=new int[arr.length];
mergeSort(arr, 0, arr.length-1, temp);
System.out.println("排序后的数组为:"+Arrays.toString(arr ));

}
/**
* 分和治
* @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;//初始化j,右边有序序列的初始索引
int t=0;//指向temp数组的当前索引

//先把左右两边(有序)的数组,按照一定的规则,填充到temp数组中,直到左右两边的有序序列处理完毕
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;
}
}
//把有数据剩余的一方的数据依次填充到temp中
while(i<=mid) {//说明左边有序序列数据还有剩余
temp[t]=arr[i];
t+=1;
i+=1;
}
while(j<=right) {//说明右边有序序列数据还有剩余
temp[t]=arr[j];
t+=1;
j+=1;
}
//将temp数组中的数据拷贝到arr中,注意并不是每次都拷贝所有,针对待排序数组,会有七次拷贝
t=0;
int tempLeft=left;
System.out.println("tempLeft="+tempLeft+"right="+right);
while(tempLeft<=right) {
arr[tempLeft]=temp[t];
t+=1;
tempLeft+=1;
}
}

}

截图:

 感兴趣可以测试一下速度,和其他算法做一下比较

原文地址:https://www.cnblogs.com/juddy/p/13775652.html