1、核心思想:
空
2、时间复杂度:O(n^2)
3、稳定性:稳定
4、空间复杂度:O(2n)
5、上代码:
private static int[] tempArray;
public static void main(String[] args) {
int[] array = new int[]{9, 12, 92, 3, 0, 1, 23, 8, 20};
mergeSort(array, 0, array.length-1);
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
private static void mergeSort(int[] array, int left, int right){
// 当left等于right后结束拆分
if(left < right){
// 根据left和right计算中间位置
int middle = (right + left)/2;
// 继续拆分左边
mergeSort(array, left, middle);
// 继续拆分右边
mergeSort(array, middle+1, right);
// 数据合并
merge(array, left, middle, right);
}
}
private static void merge(int[] array, int left, int middle, int right){
tempArray = new int[right-left+1];
// 左边第一个元素下标
int index1 = left;
// 右边第一个元素下标
int index2 = middle + 1;
// 临时数组待插入位置下标
int loc = 0;
// 判断当左边循环的元素不超过左边最后一个元素
// 且右边循环的元素不超过右边最后一个元素
while(index1 <= middle && index2 <= right){
// 从左到右判断两边的元素
// 当右边的元素小于左边的元素,插入右边的元素
if(array[index2] < array[index1]){
tempArray[loc] = array[index2];
loc++;
// 右边待判断的元素下标+1
index2++;
// 否则即左边的元素小于右边的元素,插入左边的元素
}else{
tempArray[loc] = array[index1];
loc++;
// 左边待判断的元素下标+1
index1++;
}
}
// 当右边元素已全部插入排序数组tempArray后
// 左边如还有剩余元素,则将左边剩余元素依次插入到tempArray最后
while(index1 <= middle){
tempArray[loc++] = array[index1++];
}
// 当左边元素已全部插入排序数组tempArray后
// 右边如还有剩余元素,则将右边剩余元素依次插入到tempArray最后
while(index2 <= right){
tempArray[loc++] = array[index2++];
}
// 将原数组left到right的数据替换为排序后临时数组tempArray的数据
for(int i=left;i<=right;i++){
array[i] = tempArray[i-left];
}
}
6、打印结果:
0 1 3 8 9 12 20 23 92
Process finished with exit code 0
***看懂了喜欢的可以点个赞哦,后续还会出新的笔记分享,谢谢大家!
以上内容欢迎评论,欢迎指正。