c++ - 基于交换的排序算法交换次数的奇偶性
问题描述
如果我有一个从0
to的整数的排列n-1
,并且我想按升序对排列进行排序,那么无论使用哪种基于交换的排序方法,排序所需的交换次数的奇偶性都是真的吗?所有基于交换的排序方法都相同吗?
例如,考虑我在下面提供的基于交换的排序方法,用 C++ 编写:
(注意:pos[i]
在列表中存储元素“i”的当前索引(基于 0))
int cnt = 0; // stores the number of operations
for (int i = 0; i < n; i++) {
if (pos[i] != i) {
cnt++;
int temp = a[i];
int temp_pos = pos[i];
swap(a[i], a[pos[i]]);
pos[i] = i;
pos[temp] = temp_pos;
}
}
与其他基于交换的排序方法相比,当对从到的整数的相同排列执行时,基于交换的排序算法(如上述一种算法)是否具有相同的排序所需的交换数量的奇偶校验?0
n-1
解决方案
对,是真的。证明的草图是这样的。
元素序列中的反转是任何未按正确排序顺序的元素对:即a[i] > a[j]
对于某些i < j
. 完全排序的数组有零反转。交换任意两个元素会使反转的总计数改变奇数(这一点的证明留给读者练习)。因此,如果数组最初有奇数次反转,则必须执行奇数次交换才能对其进行排序;如果它以偶数次反转开始,则需要偶数次交换。
推荐阅读
- r - 根据“NA”值在新列内添加逻辑值
- android - Android Studio,Junit 加到 classpath 后也无法解析
- angular - 如何在 Angular 的量角器中测试 toast 消息?
- r - 从 data.frame 清除列表,没有行号中的名称
- python - XGBoost 与 GridSearchCV、缩放、PCA 和 sklearn 管道中的 Early-Stopping
- r - 在大数据框中转换为日期时如何为缺少日期和月份的杂乱日期数据指定日期和月份
- android - 如何将 editText 值传递给 viewModel 和 Livedata (Kotlin)
- javascript - 如何使 Unity WebGL 应用程序放置在简单的 html 页面上异步加载?
- javascript - javascript for 循环只执行一次
- rest - Spring Web:将 URL 映射到独立的 Spring 应用程序