题目来源:码蹄集
题目描述:
大致思路:
使用冒泡排序算法,使用归并排序也行。每次从左到右扫描数组,如果发现当前位置比下一个位置的元素大,则交换这两个元素,同时累加交换次数。交换的操作会使得当前元素变小,因此我们需要多次重复这个过程直到数组升序排列。
Python代码实现:
n = int(input())
a = list(map(int, input().split()))
ans = 0
temp = [0] * (n+1)
def merge_pai(l, r, mid):
global ans
i, p, j = l, l, mid
while i < mid and j <= r:
if a[i] <= a[j]:
temp[p] = a[i]
i += 1
else:
temp[p] = a[j]
j += 1
ans += mid - i
p += 1
while i < mid:
temp[p] = a[i]
i += 1
p += 1
while j <= r:
temp[p] = a[j]
j += 1
p += 1
for i in range(l, r+1):
a[i] = temp[i]
def merge_sort(l, r):
if l < r:
mid = (l + r) // 2
merge_sort(l, mid)
merge_sort(mid + 1, r)
merge_pai(l, r, mid + 1)
merge_sort(0, n-1)
print(ans)
C++代码实现:
参考链接:https://yxsmarter.blog.csdn.net/article/details/128211350?spm=1001.2014.3001.5502
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, ans = 0;
int a[200010], temp[200010];
void merge_pai(int l, int r, int mid) {
int i = l, p = l, j = mid;
while (i < mid && j <= r) {
if (a[i] <= a[j])
temp[p++] = a[i++];
else {
temp[p++] = a[j++];
ans += mid - i;
}
}
while (i < mid)
temp[p++] = a[i++];
while (j <= r)
temp[p++] = a[j++];
p = i = l;
while (p <= r)
a[i++] = temp[p++];
}
void merge_sort(int l, int r) {
if (l < r) {
int mid = (l + r) / 2;
merge_sort(l, mid);
merge_sort(mid + 1, r);
merge_pai(l, r, mid + 1);
}
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
merge_sort(1, n);
cout << ans << endl;
}
Java代码实现demo1(错一个测试用例):
import java.util.*;
public class Main {
static int n, ans;
static int[] a;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new int[n];
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();
merge_sort(0, n-1);
System.out.println(ans);
}
public static void merge(int l, int mid, int r) {
int[] temp = new int[r-l+1];
int i = l, j = mid+1, p = 0;
while (i <= mid && j <= r) {
if (a[i] <= a[j])
temp[p++] = a[i++];
else {
temp[p++] = a[j++];
ans += mid - i + 1;
}
}
while (i <= mid)
temp[p++] = a[i++];
while (j <= r)
temp[p++] = a[j++];
for (int k = 0; k < p; k++)
a[l+k] = temp[k];
}
public static void merge_sort(int l, int r) {
if (l < r) {
int mid = (l + r) / 2;
merge_sort(l, mid);
merge_sort(mid+1, r);
merge(l, mid, r);
}
}
}
Java代码实现demo2(超时,错一个测试用例):
import java.util.*;
public class Main {
static int n, ans;
static int[] a;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new int[n];
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();
bubble_sort();
System.out.println(ans);
}
public static void bubble_sort() {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
ans++;
}
}
}
}
}
代码提交测试结果:
附B站老师讲解链接,可供参考:https://www.bilibili.com/video/BV1cs4y137za/?t=1361.0&vd_source=3ae2a916df1bc5c1114c2bf3e95a2118