- 归并排序的思想是分而治之、归并的思想。
- 假设middle左边和右边的数组已经排好序了,那我们要做的事就是合并这两个子数组,合并的过程就称为“并”。那怎么才能做到使左边和右边的数组已经排好序呢?这就是“归”的步骤要做的事,不断拆分数组,直到子数组大小为1,直接调用“并”的过程就好了。
- 实现代码如下:
//left~middle有序,middle+1~right有序,该函数实现了“并”的部分
public void merge(int[] array , int left , int middle , int right) {
ArrayList<Integer> list = new ArrayList<>();//合并两个子数组并存储到list中
int index1 = left;
int index2 = middle+1;
for(;index1<=middle&&index2<=right;) {
if(array[index1]<=array[index2]) {
list.add(array[index1]);
index1++;
} else {
list.add(array[index2]);
index2++;
}
}
if(index1<=middle) { //左边的数组没添加完
while(index1<=middle) {
list.add(array[index1]);
index1++;
}
}
if(index2<=right) { //右边的数组没添加完
while(index2<=right) {
list.add(array[index2]);
index2++;
}
}
//合并完毕,将数值写回数组
for(int i=left,j=0 ; i<=right ; i++,j++) {
array[i]=list.get(j);
}
}
//不断拆分已达到合并两个长度为1的数组
public void merge_sort(int[] array , int left , int right) {
if(left>=right) {
return;
}
int middle = (left+right)/2;
merge_sort(array,left,middle);
merge_sort(array,middle+1,right);
merge(array,left,middle,right);
}