package sort;
public class MergeSort {
// 使用了一个额外的数组
private static int[] numbersCopy ;
public static void sort(int[] numbers){
numbersCopy = new int[numbers.length];
sort(numbers,0,numbers.length-1);
}
private static void sort(int[] numbers, int start, int end){
if (end<=start){
return;
}
int mid = start + (end-start)/2;
sort(numbers,start,mid);
sort(numbers,mid+1,end);
merge(numbers,start,end,mid);
}
/**
* 工具方法
* 归并两个已经有序的子数组
* 双指针思想
* @param numbers
* @param start
* @param end
* @param mid
*/
public static void merge(int[] numbers, int start, int end, int mid){
int start1 = start;
int start2 = mid+1;
for (int k=start; k<=end; k++){
numbersCopy[k] = numbers[k];
}
for (int k=start; k<=end; k++){
if (start1>mid){
// 左半边用尽,取右半边的元素
numbers[k] = numbersCopy[start2];
// 右半边指针后移一位
start2++;
}else if (start2>end){
// 右半边用尽,取左半边元素
numbers[k] = numbersCopy[start1];
// 左半边指针后移一位
start1++;
}else if (numbersCopy[start2]<numbersCopy[start1]){
// 右半边指针的当前元素 < 左半边的当前元素
numbers[k] = numbersCopy[start2];
// 右半边指针后移一位,左半边指针不动
start2++;
}else {
// 左半边指针的当前元素 < 右半边的当前元素
numbers[k] = numbersCopy[start1];
// 左半边指针后移一位,右半边指针不动
start1++;
}
}
}
public static void main(String[] args) {
int[] a = {1,3,1,4,5,6,1,1,1,1};
MergeSort.sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
}
}
归并排序的递归写法
于 2022-02-09 21:13:11 首次发布
该博客详细介绍了归并排序算法的实现过程,包括如何使用双指针思想进行两个有序子数组的合并。博客中提供的`MergeSort`类展示了完整的Java代码实现,通过递归将数组分割并归并,实现稳定且时间复杂度为O(n log n)的排序。在主函数中,对一个包含重复元素的数组进行了排序并打印了排序结果。
摘要由CSDN通过智能技术生成