一种简单的思路是,先将后n-m个元素按升序翻转,变成升序有序,然后再使用归并排序的思想,将前m个元素和翻转后的后n-m个元素进行合并排序,排序时比较两个元素的大小时,选择降序排列即可。

具体实现如下:

  1. 翻转后n-m个元素,变成升序有序
for (int i = m, j = n - 1; i < j; i++, j--) {
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp;
}
  1. 归并排序,比较两个元素大小时,选择降序排列
void merge(int A[], int left, int mid, int right) {
    int temp[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (A[i] > A[j]) {
            temp[k++] = A[i++];
        } else {
            temp[k++] = A[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = A[i++];
    }
    while (j <= right) {
        temp[k++] = A[j++];
    }
    for (int p = 0; p < k; p++) {
        A[left + p] = temp[p];
    }
}

void mergeSort(int A[], int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(A, left, mid);
        mergeSort(A, mid + 1, right);
        merge(A, left, mid, right);
    }
}

mergeSort(A, 0, n - 1);

完整代码如下:

#include <iostream>

using namespace std;

void merge(int A[], int left, int mid, int right) {
    int temp[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (A[i] > A[j]) {
            temp[k++] = A[i++];
        } else {
            temp[k++] = A[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = A[i++];
    }
    while (j <= right) {
        temp[k++] = A[j++];
    }
    for (int p = 0; p < k; p++) {
        A[left + p] = temp[p];
    }
}

void mergeSort(int A[], int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(A, left, mid);
        mergeSort(A, mid + 1, right);
        merge(A, left, mid, right);
    }
}

int main() {
    int n = 8;
    int A[8] = {1, 3, 5, 7, 6, 4, 2, 0};
    int m = 4;

    for (int i = m, j = n - 1; i < j; i++, j--) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }

    mergeSort(A, 0, n - 1);

    for (int i = 0; i < n; i++) {
        cout << A[i] << " ";
    }

    return 0;
}
``
算法设计题:给定一个长度为n的数组A已知其前m mn个元素按升序有序后n-m个元素按降序有序请编写算法对数组A的元素按降序进行排序。

原文地址: https://www.cveoy.top/t/topic/e3Ip 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录