// 将a[p...r] 和a[r+1...q] 合并到 b[0...q-p]void Merge2Sort(int *a, int *b, int p, int r, int q){ int i = p, j = r+1, k = 0; while(i<=r && j<=q){ if(a[i] < a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while(i<=r) b[k++] = a[i++]; while(j<=q) b[k++] = a[j++];}// 多段二路合并://a[p...q],每len个元素为一个有序段,将这些连续有序段合并为一个有序段存入b[ ]void MergeMSort(int *a, int *b, int p, int q, int len){ int i = p, j = 0, k; while(i + 2*len-1 <= q){ Merge2Sort(a, b+j, i, i+len-1, i+2*len-1); i += 2*len; j += 2*len; } if(i+len <=q) // Two segments Merge2Sort(a, b+j, i, i+len-1, q); else for(k=i; k<=q; k++) b[j++] = a[k];}// a[p...q] 归并排序 using by b[0...q-p]void MergeSort(int *a, int* b, int p, int q){ int len = 1; while(len < q-p+1){ // a[p...q] -> b[0...q-p] MergeMSort(a, b, p, q, len); len *= 2; // b[0...q-p] -> a[p...q] MergeMSort(b, a+p, 0, q-p, len); } }