在 C++ 中找到导致归并排序最坏情况的排列
假设我们有一组元素;我们必须找到这些元素的哪种排列会导致归并排序的最坏情况?众所周知,归并排序在渐近意义上始终消耗 O(n log n) 时间,但某些情况需要更多比较并消耗更多时间。在这里,我们必须找到输入元素的排列,当使用典型的归并排序算法进行排序时,该排列将需要更多的比较次数。
因此,如果输入类似于 [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],则输出将为 [11,19,15,23,13,21,17,25,12,20,16,24,14,22,18,26]。
为了解决这个问题,我们将遵循以下步骤:
- 定义一个函数 merge(),它将接收数组 arr、数组 left、数组 right、l_index、m_index、r_index 作为参数。
- 对于初始化 i := 0,当 i <= m_index - l_index 时,更新(i 增加 1),执行:
- arr[i] := left[i]
- 对于初始化 j := 0,当 j < r_index - m_index 时,更新(j 增加 1),执行:
- arr[i + j] = right[j]
- 定义一个函数 divide(),它将接收数组 arr、数组 left、数组 right、l_index、m_index、r_index 作为参数。
- 对于初始化 i := 0,当 i <= m_index - l_index 时,更新(i 增加 1),执行:
- left[i] := arr[i * 2]
- 对于初始化 i := 0,当 i < r_index - m_index 时,更新(i 增加 1),执行:
- right[i] := arr[i * 2 + 1]
- 定义一个函数 gen_worst_seq(),它将接收数组 arr[]、l_index、r_index 作为参数。
- 如果 l_index < r_index,则:
- m_index := l_index + (r_index - l_index) / 2
- 定义一个大小为 m_index-l_index+1 的数组 left。
- 定义一个大小为 r_index-m_index 的数组 right。
- divide(arr, left, right, l_index, m_index, r_index)
- gen_worst_seq(left, l_index, m_index)
- gen_worst_seq(right, m_index + 1, r_index)
- merge(arr, left, right, l_index, m_index, r_index)
示例
让我们看看以下实现以获得更好的理解:
#include <bits/stdc++.h>
using namespace std;
void display(int A[], int size) {
for (int i = 0; i < size; i++)
cout << A[i] << " ";
cout << endl;
}
int merge(int arr[], int left[], int right[],int l_index, int m_index, int r_index) {
int i;
for (i = 0; i <= m_index - l_index; i++)
arr[i] = left[i];
for (int j = 0; j < r_index - m_index; j++)
arr[i + j] = right[j];
}
int divide(int arr[], int left[], int right[], int l_index, int m_index, int r_index) {
for (int i = 0; i <= m_index - l_index; i++)
left[i] = arr[i * 2];
for (int i = 0; i < r_index - m_index; i++)
right[i] = arr[i * 2 + 1];
}
int gen_worst_seq(int arr[], int l_index, int r_index) {
if (l_index < r_index) {
int m_index = l_index + (r_index - l_index) / 2;
int left[m_index - l_index + 1];
int right[r_index - m_index];
divide(arr, left, right, l_index, m_index, r_index);
gen_worst_seq(left, l_index, m_index);
gen_worst_seq(right, m_index + 1, r_index);
merge(arr, left, right, l_index, m_index, r_index);
}
}
int main() {
int arr[] = {11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26};
int n = sizeof(arr) / sizeof(arr[0]);
gen_worst_seq(arr, 0, n - 1);
display(arr, n);
}输入
11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
输出
11 19 15 23 13 21 17 25 12 20 16 24 14 22 18 26
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP