数据结构之归并排序的Java实现

时间:2022-04-06 10:43:32

Java代码如下:

import java.util.Random;

/**
* 归并排序
*/
public class MergeSort {

public static void main(String[] args) {
int[] arr = getRandomArray(10);
System.out.println("before sort: ");
showArr(arr);

mergeSort(arr, 0, arr.length - 1);

System.out.println("after sort: ");
showArr(arr);
}

//归并排序递归算法
public static void mergeSort(int[] arr, int start, int end) {
if(start >= end) {
return ;
}
int mid = (start + end) / 2;
mergeSort(arr, start, mid); //左半边的子表使用递归
mergeSort(arr, mid + 1, end); //右半边的子表使用递归
merge(arr, start, end); //合并左右两边的表
}

//合并两个子表
public static void merge(int[] arr, int start, int end) {
int mid = (start + end) / 2; //计算arr表的中间点,则两个子表分别是start ~ mid, mid + 1 ~ end
int x = start; //第一个子表的起始位置
int y = mid + 1; //第二个子表的起始位置
int[] tempArr = new int[end - start + 1]; //分配一个和arr相同大小的数组
int pos = 0;
while(x <= mid && y <= end) {
if(arr[x] > arr[y]) {
tempArr[pos++] = arr[y++];
}else {
tempArr[pos++] = arr[x++];
}
}

while(x <= mid) {
tempArr[pos++] = arr[x++];
}

while(y <= end) {
tempArr[pos++] = arr[y++];
}

//将临时数组中的数据复制到arr数组中
for(int i = 0; i < tempArr.length; i++) {
arr[start + i] = tempArr[i];
}
}

public static int[] getRandomArray(int size) {
int[] arr = new int[size];
Random random = new Random();
for(int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(300);
}
return arr;
}

public static void showArr(int[] arr) {
for(int i = 0; i < arr.length; i++) {
System.out.print(String.format("%d ", arr[i]));
}
System.out.println();
}

}
运行上面的代码两次,结果如下图所示:

数据结构之归并排序的Java实现


数据结构之归并排序的Java实现