JAVA版本的归并排序算法如下
请大家指正,谢谢!
/**
* User: cuitongxin
* Date: 13-3-31
*/
public class MergeSort {
public static int[] a = {13,67,32,9,43,1,19,7,52,89,73,0,10,60,99,30};
public static void main(String[] args) {
int[] temp = new int[a.length];
mergeSort(a,temp,0,a.length-1);
System.out.println(Arrays.toString(a));
}
/**
* 归并排序主算法
* @param a 需要归并排序的数组
* @param temp 归并排序的临时数组,用户存放排序前的分组数组数据
* @param startIndex 数组的开始索引
* @param endIndex 数组的结束索引
*/
private static void mergeSort(int[] a, int[] temp, int startIndex, int endIndex) {
//数组中的元素大于1个时开始排序
if (startIndex < endIndex) {
//确定分组的中间元素索引位置
int middle = (startIndex + endIndex) / 2 ;
//对分组后的左边组进行归并排序
mergeSort(a,temp,startIndex,middle);
//对分组后的右边组进行归并排序
mergeSort(a,temp,middle+1,endIndex);
//合并已排序好的两个组,形成一个有序组
merge(a, temp, startIndex, middle, endIndex);
}
}
/**
* 合并算法
* @param a 用户存放排序号的数据
* @param temp 用于存放分组数组
* @param startIndex 数组的整个起始索引
* @param middle 数组的中间索引
* @param endIndex 数组的结束索引
*/
private static void merge(int[] a, int[] temp, int startIndex, int middle, int endIndex) {
//把原数据放入临时数组中
for (int i=0; i<a.length;i++){
temp[i] = a[i];
}
int left = startIndex; //左边分组的起始索引
int right = middle + 1; // 右边分组的起始索引
int index = startIndex; //合并后数组的起始索引
//对左边分组和右边分组进行循环比较
while ((left <= middle) && (right <= endIndex)) {
//如果左边分组当前的元素大于右边分组则把右边分组的元素放入排序好的数组中,else 执行相反操作
if (temp[left] > temp[right]) {
a[index++] = temp[right++];
} else {
a[index++] = temp[left++];
}
}
//如果分组比较大小完成之后,发现左边组还有数据,则把左边组的数据复制到排序好的数组中
while (left <= middle) {
a[index++] = temp[left++];
}
//如果分组比较大小完成之后,发现右边组还有数据,则把左边组的数据复制到排序好的数组中
while (right <= endIndex) {
a[index++] = temp[right++];
}
}
}