归并排序算法思想:将一个无序数组分成两部分,然后各个部分继续分解,递归调用,直至子数组天然有序(只有一个数就是天然有序),然后自底向上,将每个子数组一一合并,然后最后就合并成一个有序的数组。
递归方法,分解无序数组:
/**
* 递归调用该方法进行数组的排序
*
* @param arr1
* @return
*/
public static void mergeSort(int[] arr1) {
sort(arr1, 0, arr1.length - 1);
}
// 排序的方法
public static void sort(int[] data, int left, int right) {
if (left >= right) {
return;
}
int center = (left + right) / 2;
sort(data, left, center);
sort(data, center + 1, right);
// 合并
merge(data, left, center, right);
print(data);
}
将两个有序数组合并成一个有序数组的方法实现:
/**
* 将两个有序数组和平为一个有序数组的方法
*
* @param a
* @param b
* @param c
* @return
*/
public static void merge(int[] data, int left, int center, int right) {
int[] tmpArr = new int[data.length];
int mid = center + 1;
int third = left;
int tmp = left;
while (left <= center && mid <= right) {
if (data[left] <= data[mid]) {
tmpArr[third++] = data[left++];
} else {
tmpArr[third++] = data[mid++];
}
}
// 当一个数组全部添加之后将另一个数组的剩余部分直接加到后面
while (mid <= right) {
tmpArr[third++] = data[mid++];
}
while (left <= center) {
tmpArr[third++] = data[left++];
}
while (tmp <= right) {
data[tmp] = tmpArr[tmp++];
}
}