int n,a[100001]; voidpop_sort(){ for (int i = 1; i <= n; i ++) for (int j = 1; j < n;j ++) if (a[j] > a[j+1]) swap(a[j], a[j + 1]);//change a[j] and a[j+1]. }
① 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
② 设定两个指针,最初位置分别为两个已经排序序列的起始位置。
③ 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
④ 重复步骤③直到某一指针到达序列尾。
⑤ 将另一序列剩下的所有元素直接复制到合并序列尾。
递归法
① 将序列每相邻两个数字进行归并操作,形成$\left \lfloor \frac{n}{2} \right \rfloor 个序列,排序后每个序列包含两个元素。②将上述序列再次归并,形成\left \lfloor \frac{n}{4} \right \rfloor $个序列,每个序列包含四个元素。
③ 重复步骤②,直到所有元素排序完毕。
核心模板代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voidmergesort(int l, int r, int a[]) { int mid = l + r >> 1; if (l == r) return; mergesort(l, mid, a); mergesort(mid + 1, r, a);
int i = l, j = mid + 1, k = l; while (i <= mid && j <= r) { if (a[i] > a[j]) b[k ++] = a[j ++]; else b[k ++] = a[i ++]; } while (i <= mid) b[k ++] = a[i ++]; while (j <= r) b[k ++] = a[j ++]; for (int i = l; i <= r; i++) a[i] = b[i]; }