快排与归并排序
快排 O(nlogn)
- 数组
q,左端点l, 右端点r - 确定
x取数组q中间值的比较值边界 - 调整区间,将
q分为<=x和>=x的两个区间 - 递归处理左右两段区间
注意:递归边界
void quick_sort(int q[], int l, int r)
{
// 递归边界
if (l >= r) return;
// 确定比较边界
int x = q[l + r >> 1], i = l - 1, j = r + 1;
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
// 递归分治
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
归并 O(nlogn)
- 数组
q和tmp,左端点l,右端点r - 确定
mid取区间中点的边界 - 以
mid为中心, 递归分治左右两个区间 - 二路归并,将临时数组拷贝到区间数组
注意:函数调用时处理的都是 l 到 r 这段区间
void merge_sort(int q[], int l, int r)
{
// 递归边界
if (l >= r) return;
// 划分边界
int mid = l + r >> 1;
// 递归分治
merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
// 二路归并
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r)
tmp[k ++ ] = q[i] <= q[j] ? q[i ++ ] : q[j ++ ];
// 将剩下的数组拼接
while (i <= mid) tmp[k ++ ] = q[i ++ ];
while (j <= r) tmp[k ++ ] = q[j ++ ];
// 将有序的数组存到q相应区间中
for (i = l, j = 0; i <= r; i ++ , j ++ ) q[i] = tmp[j];
}

浙公网安备 33010602011771号