归并排序:逆序对问题
Posted causewang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序:逆序对问题相关的知识,希望对你有一定的参考价值。
归并排序:逆序对问题
在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印所有逆序对
代码
#include <stdio.h>
int helperArr[10];
void Merge(int arr[], int l, int mid, int r)
{
int i = l;
int p1 = l;
int p2 = mid + 1;
while (p1 <= mid && p2 <= r) {
if (arr[p1] > arr[p2]) {
for (int j = p2; j <= r; ++j) {
printf("[%d, %d] ", arr[p1], arr[j]);
}
}
helperArr[i++] = arr[p1] > arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid) {
helperArr[i++] = arr[p1++];
}
while (p2 <= r) {
helperArr[i++] = arr[p2++];
}
for (; l <= r; l++) {
arr[l] = helperArr[l];
}
}
void MergeSort(int arr[], int l, int r)
{
if (l == r) {
return;
}
int mid = l + ((r - l) >> 1); // =(l+r)/2 因为l+r有可能会溢出,所以改成减法的方式
MergeSort(arr, l, mid);
MergeSort(arr, mid + 1, r);
Merge(arr, l, mid, r);
}
void MergeInversion(int arr[], int size)
{
if (arr == NULL || size < 2) {
return;
}
return MergeSort(arr, 0, size - 1);
}
void PrintArr(int arr[], int size)
{
printf("
");
for (int i = 0; i < size; ++i) {
printf("%d ", arr[i]);
}
printf("
");
}
int main()
{
int arr[10] = {6, 0, 5, 3, 15, 21, 13, 9, 12, 8};
PrintArr(arr, 10);
MergeInversion(arr, 10);
PrintArr(arr, 10);
return 0;
}
以上是关于归并排序:逆序对问题的主要内容,如果未能解决你的问题,请参考以下文章