added algo to count inversions in an array in C++, Python, JavaScript and Java (#79)
* algo to count inversions in array Added in C++, Python, JavaScript and Java * Added comments * Rename arrays/javascript/count-inversions.js to arrays/js/count-inversions.js * Update count-inversions.cpp * Update count-inversions.java * Update count-inversions.js * Update count-inversions.pypull/87/head
parent
8cb86de0d7
commit
feb6dc99be
|
@ -0,0 +1,17 @@
|
||||||
|
# Algorithms related to arrays
|
||||||
|
|
||||||
|
### C or C++
|
||||||
|
|
||||||
|
1. [Counting Inversions](c-or-cpp/count-inversions.cpp)
|
||||||
|
|
||||||
|
### Python
|
||||||
|
|
||||||
|
1. [Counting Inversions](python/count-inversions.py)
|
||||||
|
|
||||||
|
### JavaScript
|
||||||
|
|
||||||
|
1. [Counting Inversions](js/count-inversions.js)
|
||||||
|
|
||||||
|
### Java
|
||||||
|
|
||||||
|
1. [Counting Inversions](java/count-inversions.java)
|
|
@ -0,0 +1,55 @@
|
||||||
|
// Algorithm Type: Divide & Conquer
|
||||||
|
// Time Complexity: O(n*log(n))
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <fstream>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
long long int count_split_inv(vector<int> &vec, vector<int> &left, vector<int> &right) {
|
||||||
|
long long int split_inv = 0;
|
||||||
|
int ridx = 0, lidx = 0;
|
||||||
|
int size = vec.size();
|
||||||
|
int lsize = left.size();
|
||||||
|
int rsize = right.size();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
if (lidx != lsize && ridx != rsize) {
|
||||||
|
if (right[ridx] <= left[lidx]) {
|
||||||
|
vec[i] = right[ridx];
|
||||||
|
ridx++;
|
||||||
|
split_inv += lsize - lidx;
|
||||||
|
} else {
|
||||||
|
vec[i] = left[lidx];
|
||||||
|
lidx++;
|
||||||
|
}
|
||||||
|
} else if (lidx == lsize) {
|
||||||
|
vec[i] = right[ridx];
|
||||||
|
ridx++;
|
||||||
|
} else if (ridx == rsize) {
|
||||||
|
vec[i] = left[lidx];
|
||||||
|
lidx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return split_inv;
|
||||||
|
}
|
||||||
|
|
||||||
|
long long int count_inversions(vector<int> &vec) {
|
||||||
|
int size = vec.size();
|
||||||
|
if (size == 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
vector<int> left(vec.begin(), vec.begin() + size / 2);
|
||||||
|
vector<int> right(vec.begin() + size / 2, vec.end());
|
||||||
|
long long int left_inv = count_inversions(left);
|
||||||
|
long long int right_inv = count_inversions(right);
|
||||||
|
long long int split_inv = count_split_inv(vec, left, right);
|
||||||
|
|
||||||
|
return left_inv + right_inv + split_inv;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
vector<int> v{8, 2, 1, 5, 7, 3, 9, 2, 0, 1};
|
||||||
|
cout << count_inversions(v) << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
// Algorithm Type: Divide & Conquer
|
||||||
|
// Time Complexity: O(n*log(n))
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class inversions {
|
||||||
|
private static long count_split_inv(int[] arr, int[] left, int[] right) {
|
||||||
|
long split_inv = 0;
|
||||||
|
int ridx = 0, lidx = 0;
|
||||||
|
int size = arr.length;
|
||||||
|
int rsize = right.length;
|
||||||
|
int lsize = left.length;
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
if (lidx != lsize && ridx != rsize) {
|
||||||
|
if (right[ridx] <= left[lidx]) {
|
||||||
|
arr[i] = right[ridx];
|
||||||
|
ridx++;
|
||||||
|
split_inv += lsize - lidx;
|
||||||
|
} else {
|
||||||
|
arr[i] = left[lidx];
|
||||||
|
lidx++;
|
||||||
|
}
|
||||||
|
} else if (lidx == lsize) {
|
||||||
|
arr[i] = right[ridx];
|
||||||
|
ridx++;
|
||||||
|
} else if (ridx == rsize) {
|
||||||
|
arr[i] = left[lidx];
|
||||||
|
lidx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return split_inv;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long count_inversions(int[] arr) {
|
||||||
|
int size = arr.length;
|
||||||
|
if (size == 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int[] left = Arrays.copyOfRange(arr, 0, size / 2);
|
||||||
|
int[] right = Arrays.copyOfRange(arr, size / 2, size);
|
||||||
|
long left_inv = count_inversions(left);
|
||||||
|
long right_inv = count_inversions(right);
|
||||||
|
long split_inv = count_split_inv(arr, left, right);
|
||||||
|
|
||||||
|
return left_inv + right_inv + split_inv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
int[] arr = {8, 2, 1, 5, 7, 3, 9, 2, 0, 1};
|
||||||
|
System.out.println(count_inversions(arr));
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("Err... ");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
// Algorithm Type: Divide & Conquer
|
||||||
|
// Time Complexity: O(n*log(n))
|
||||||
|
|
||||||
|
function count_split_inv(arr, left, right) {
|
||||||
|
let split_inv, lidx, ridx;
|
||||||
|
split_inv = ridx = lidx = 0;
|
||||||
|
let size = arr.length;
|
||||||
|
let lsize = left.length;
|
||||||
|
let rsize = right.length;
|
||||||
|
for (let i = 0; i < size; i++) {
|
||||||
|
if (lidx != lsize && ridx != rsize) {
|
||||||
|
if (right[ridx] <= left[lidx]) {
|
||||||
|
arr[i] = right[ridx];
|
||||||
|
ridx++;
|
||||||
|
split_inv += lsize - lidx;
|
||||||
|
} else {
|
||||||
|
arr[i] = left[lidx];
|
||||||
|
lidx++;
|
||||||
|
}
|
||||||
|
} else if (lidx == lsize) {
|
||||||
|
arr[i] = right[ridx];
|
||||||
|
ridx++;
|
||||||
|
} else if (ridx == rsize) {
|
||||||
|
arr[i] = left[lidx];
|
||||||
|
lidx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return split_inv;
|
||||||
|
}
|
||||||
|
|
||||||
|
function count_inversions(arr) {
|
||||||
|
let size = arr.length;
|
||||||
|
if (size == 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
let mid = parseInt(size / 2);
|
||||||
|
let left = arr.slice(0, mid);
|
||||||
|
let right = arr.slice(mid, size);
|
||||||
|
let left_inv = count_inversions(left);
|
||||||
|
let right_inv = count_inversions(right);
|
||||||
|
let split_inv = count_split_inv(arr, left, right);
|
||||||
|
|
||||||
|
return left_inv + right_inv + split_inv;
|
||||||
|
}
|
||||||
|
|
||||||
|
var arr = [8, 2, 1, 5, 7, 3, 9, 2, 0, 1];
|
||||||
|
|
||||||
|
console.log(count_inversions(arr));
|
|
@ -0,0 +1,42 @@
|
||||||
|
"""
|
||||||
|
Algorithm Type: Divide & Conquer
|
||||||
|
Time Complexity: O(n*log(n))
|
||||||
|
"""
|
||||||
|
|
||||||
|
def count_split_inv(arr, left, right):
|
||||||
|
split_inv = ridx = lidx = 0
|
||||||
|
size = len(arr)
|
||||||
|
lsize = len(left)
|
||||||
|
rsize = len(right)
|
||||||
|
for i in range(size):
|
||||||
|
if lidx != lsize and ridx != rsize:
|
||||||
|
if right[ridx] <= left[lidx]:
|
||||||
|
arr[i] = right[ridx]
|
||||||
|
ridx += 1
|
||||||
|
split_inv += lsize - lidx
|
||||||
|
else:
|
||||||
|
arr[i] = left[lidx]
|
||||||
|
lidx += 1
|
||||||
|
elif lidx == lsize:
|
||||||
|
arr[i] = right[ridx]
|
||||||
|
ridx += 1
|
||||||
|
elif ridx == rsize:
|
||||||
|
arr[i] = left[lidx]
|
||||||
|
lidx += 1
|
||||||
|
return split_inv;
|
||||||
|
|
||||||
|
def count_inversions(arr):
|
||||||
|
size = len(arr)
|
||||||
|
if size == 1:
|
||||||
|
return 0
|
||||||
|
mid = int(size/2)
|
||||||
|
left = arr[:mid]
|
||||||
|
right = arr[mid:]
|
||||||
|
l_inv = count_inversions(left)
|
||||||
|
r_inv = count_inversions(right)
|
||||||
|
split_inv = count_split_inv(arr, left, right)
|
||||||
|
|
||||||
|
return l_inv + r_inv + split_inv
|
||||||
|
|
||||||
|
numbers = [8, 2, 1, 5, 7, 3, 9, 2, 0, 1]
|
||||||
|
print(count_inversions(numbers))
|
Loading…
Reference in New Issue