先说说归并的概念:归并就是将两个或多个有序表合并成一个有序表的过程。若将两个有序表合成一个有序表则称为二路归并,同理,有三路归并、四路归并等。二路归并最为简单和常用。
归并排序就是指利用归并操作把一个无序表排序成一个有序表的过程。
利用二路归并操作进行排序称为二路归并排序,具体过程:
- 首先把待排序表中的每一个元素都看做一个有序表,那么n个元素构成n个有序表。
- 接着两两归并一趟归并得到[n/2]个长度为2的有序表(最后一个表长度可能小于2)
- 然后再将有序表进行两两归并,得到[[n/2]/2]个长度为4的有序表(最后一个表长度可能小于4)
- 最后得到一个长度为n的有序表为止
import java.util.Arrays;
public class MergeSort {
public static void mergeSort(int[] arrays){
sort(arrays, 0, arrays.length - 1);
}
public static int[] sort(int[] arrays, int left, int right) {
int mid = (left + right) / 2;//中间元素下标
if (left < right) {
//对左边数组进行递归
sort(arrays, left, mid);
//对右边数组进行递归
sort(arrays, mid + 1, right);
//左右归并
merge(arrays, left, mid, right);
}
return arrays;
}
public static void merge(int[] arrays, int left, int mid, int right) {
int[] temp = new int[arrays.length];//临时数组
int i = left;//左数组第一个元素的指下标
int j = mid + 1;//右数组第一个元素的下标
int k = left;//临时数组下标
//把较小的数先移到临时数组中
while (left <= mid && j <= right) {
if (arrays[left] < arrays[j]) {
temp[k++] = arrays[left++];
} else {
temp[k++] = arrays[j++];
}
}
//把左边剩余的数移入数组
while (left <= mid) {
temp[k++] = arrays[left++];
}
//把右边边剩余的数移入数组
while (j <= right) {
temp[k++] = arrays[j++];
}
//将临时数组中的内容拷贝回原数组中
while(i<=right){
arrays[i] = temp[i];
i++;
}
}
public static void main(String[] args) {
int[] arrays = {1,3,6,2,8,7,10,4,9,5};
MergeSort.mergeSort(arrays);
System.out.println(Arrays.toString(arrays));
}
}