package sort;
import java.util.Arrays;
/**
* Created by lijie35 on 2020-01-17 2:49 PM .
*/
public class MergeSort {
public static void main(String[] args) {
// int arr[] = new int[]{3,3,3,7,9,122344,4656,34,34,4656,5,6,7,8,9,343,57765,23,12321};
int[] arr = {5, 7, 3, 9, 4,4};
//mergeSort(arr);
sort(arr, 0, arr.length - 1);
//System.out.println(Arrays.toString(arr));
}
/**
* 分割的过程
* <p>
* [5, 7, 3| 9, 4]
* [5, 7| 3| 9, 4]
* [5 |7| 3| 9, 4]
* [5 |7| 3| 9| 4]
* ################
* [5, 7, 3, 9, 4]
* [3, 5, 7, 9, 4]
* [3, 5, 7, 4, 9]
* [3, 4, 5, 7, 9]
* <p>
* O(n log n)
*/
public static void sort(int[] arr, int start, int end) {
if (start == end)
return;
int mid = start + (end - start) / 2; //将中电分配给前段
//前半部分
sort(arr, start, mid);
//后半部分
sort(arr, mid + 1, end);
//归并的过程
mergeData(arr, mid, start, end);
}
/**
* 归并的过程
* 把拆分出来的两个部分合并
*/
public static void mergeData(int[] arr, int mid, int start, int end) {
int[] data = new int[end - start + 1]; //s =0 ,e =2,length =3,s+e+1=l
int index = 0;//data插入指针
int ps = start;//前段的开始指针
int pe = mid + 1;//后段开始指针
//将可比较的部分复制到新数组
while (ps < mid + 1 && pe < end + 1) {
data[index++] = arr[ps] > arr[pe] ? arr[pe++] : arr[ps++];
}
// 前部分没有比较的数据查到数组中
while (ps < mid + 1) {
data[index++] = arr[ps++];
}
//后部分没有比较数据查到数组中
while (pe < end + 1) {
data[index++] = arr[pe++];
}
//如果前部分长度比较长,填充进数组
System.arraycopy(data, 0, arr, start, data.length);
System.out.println(Arrays.toString(arr));
}
}
归并排序
最新推荐文章于 2024-08-12 19:32:44 发布