/**
* 归并排序
* 核心思想:找到数组中间下标位置,分成两个数组;
* 继续找中间位置下标位置,分成两个数组;
* 迭代
* 合并
* @param args
*/
public void mergeSort(int [] array) {
if(array != null && array.length !=0) {
mergeSort(array,0,array.length-1);
}
}
private void mergeSort(int[] array, int left, int right) {
if(left<right) {
int middle = (left+ right)/2;
//下标left 到 middle
mergeSort(array,left,middle);
//下标middle+1到 right
mergeSort(array,middle+1,right);
//合并
merge(array,left,middle,right);
}
}
/**
* 合并:
* 迭代从最内层考虑:
* 只有两个元素,则直接比较,排位即可;
* 依次增多两个(排好序的)数组的元素个数,考虑多种情况,相互合并
* @param array
* @param left
* @param middle
* @param right
*/
private void merge(int[] array, int left, int middle, int right) {
int [] tempArray = new int[array.length];
int rightStart = middle +1;
int temp = left;
int third = left;
while(left<=middle && rightStart<=right) {
if(array[left]<=array[rightStart]) {
tempArray[third++] = array[left++];
}
if(array[left]>=array[rightStart]) {
tempArray[third++] = array[rightStart++];
}
}
//left 到 middle 元素没有全部 ,添加进tempArray
while(left<=middle) {
tempArray[third++] = array[left++];
}
//middle+1 到 right 元素没有全部 ,添加进tempArray
while(rightStart<=right) {
tempArray[third++] = array[rightStart++];
}
//这里的把tempArray 赋值给 array 为什么不用 array = tempArray
while(temp <=right) {
//把所有参与比较的元素,排好序,重新赋值给原数组
array[temp] = tempArray[temp++];
}
}
归并排序
最新推荐文章于 2023-09-03 20:36:33 发布