代码:
#include<iostream>
using namespace std;
const int N = 1e4 + 10;
int is1[N], is2[N];
void merge(int low, int mid ,int high) {
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high) {
if (is1[i] < is1[j]) {
is2[k++] = is1[i++];
}
else {
is2[k++] = is1[j++];
}
}
while (i <= mid) {
is2[k++] = is1[i++];
}
while (j <= high) {
is2[k++] = is1[j++];
}
for (int i = low; i <= high; i++) {
is1[i] = is2[i];
}
}
void mergesort(int a, int b) {
if (a >= b)return;
int mid = (a + b) / 2;
mergesort(a, mid);
mergesort(mid+1, b);
merge(a, mid, b);
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> is1[i];
}
mergesort(1, n);
for (int i = 1; i <= n; i++) {
cout<< is1[i]<<" ";
}
return 0;
}
分析:
例如我们输入is1数组is1={5, 1 , 8 , 7 , 4 , 3 , 2 , 6}
注意:在输入时,第一个数保存在is1[ 1 ]中
第一次调用 mergesort ( int a=1,int b=8 )
mid = (a + b) / 2 = 4
然后递归调用mergesort
mergesort ( a = 1, mid = 4 )
mergesort(mid+1 = 5,b = 8)
之后就是不断递归调用的过程:
(红色数字是调用的顺序)
然后看一下 mergesort( 1 , 2 )
mergesort( int a = 1 ,int b = 2 ) {
if( a >= b ) return; //不满足
mid = ( a + b ) / 2 = 1;
mergesort( 1 , 1 );
mergesort( 2 , 2 );
merge(a , mid ,b );
}
最后的这两个
mergesort( 1 , 1 );
mergesort( 2 , 2 );
显然满足
if( a >= b )
所以不再进行递归,执行merge(a = 1,mid = 1 ,b=2)
i =low=1
j=mid+1=2
k=low=1
然后是比较 i 与 j 下标的数字哪个小,然后将小的数放到 k 下标所在的is2数组
这段代码可以用下面的过程来解释
进行完 6 , 7 后:
然后进行5:
2 比 3 小,2放入,j++,k++
然后 3, 4 都比6小,放入,i++,i++,k++,k++
此时便退出循环,但是6还没有放进去,所以用
来将剩余的数放进数组