快排与归并排序

快排 O(nlogn)

  1. 数组 q ,左端点 l , 右端点 r
  2. 确定 x 取数组 q 中间值的比较值边界
  3. 调整区间,将 q 分为 <=x>=x 的两个区间
  4. 递归处理左右两段区间

注意:递归边界

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)

  1. 数组 qtmp ,左端点 l ,右端点 r
  2. 确定 mid 取区间中点的边界
  3. mid 为中心, 递归分治左右两个区间
  4. 二路归并,将临时数组拷贝到区间数组

注意:函数调用时处理的都是 lr 这段区间

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];
}
posted @ 2022-05-03 21:46  feiyucoder  阅读(32)  评论(0)    收藏  举报