//时间复杂度O(nlg(n))
void Merge(int a[],int p,int q,int r) {
int n1 = q - p + 1,n2 = r - q,L[n1 + 1],R[n2 + 1];
for (int i = 0; i < n1; i++)
L[i] = a[p + i];
for (int j = 0; j < n2; j++)
R[j] = a[q + j+1];
int i = 0, j = 0;
for (int k = p; k < r+1; k++) { //注意p ,r+1
if (L[i] <= R[j]) {
a[k] = L[i];
i++;
} else {
a[k] = R[j];
j++;
}
}
}
void MergeSort(int a[],int first,int last){ //first a 有效下标的第一个从0 开始,a中有效下标的下一个
if(first<last){
int q=(first+last)/2;
MergeSort(a,first,q);//左边有序
MergeSort(a,q+1,last);//右边有序
Merge(a,first,q,last);//合并两边
}
}
int main( )
{
int a[]={5,2,4,7,1,3,2,6};
MergeSort(a,0,7);
for (int j = 0; j < 7; j++)
cout<<a[j]<<endl;
return 0;
}