算法设计题:给定一个长度为n的数组A已知其前m mn个元素按升序有序后n-m个元素按降序有序请编写算法对数组A的元素按降序进行排序。
一种简单的思路是,先将后n-m个元素按升序翻转,变成升序有序,然后再使用归并排序的思想,将前m个元素和翻转后的后n-m个元素进行合并排序,排序时比较两个元素的大小时,选择降序排列即可。
具体实现如下:
- 翻转后n-m个元素,变成升序有序
for (int i = m, j = n - 1; i < j; i++, j--) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
- 归并排序,比较两个元素大小时,选择降序排列
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;
}
``
原文地址: https://www.cveoy.top/t/topic/e3Ip 著作权归作者所有。请勿转载和采集!