Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package by.it.group351004.narivonchik.lesson04;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.util.Scanner;
- /*
- В первой строке источника данных даны:
- - целое число 1<=n<=100000 (размер массива)
- - сам массив A[1...n] из n различных натуральных чисел,
- не превышающих 10E9, в порядке возрастания,
- Во второй строке
- - целое число 1<=k<=10000 (сколько чисел нужно найти)
- - k натуральных чисел b1,...,bk не превышающих 10E9 (сами числа)
- Для каждого i от 1 до kk необходимо вывести индекс 1<=j<=n,
- для которого A[j]=bi, или -1, если такого j нет.
- Sample Input:
- 5 1 5 8 12 13
- 5 8 1 23 1 11
- Sample Output:
- 3 1 -1 1 -1
- (!) Обратите внимание на смещение начала индекса массивов JAVA относительно условий задачи
- */
- public class A_BinaryFind {
- int[] findIndex(InputStream stream) throws FileNotFoundException {
- //подготовка к чтению данных
- Scanner scanner = new Scanner(stream);
- //!!!!!!!!!!!!!!!!!!!!!!!!! НАЧАЛО ЗАДАЧИ !!!!!!!!!!!!!!!!!!!!!!!!!
- //размер отсортированного массива
- int n = scanner.nextInt();
- //сам отсортированный массива
- int[] a=new int[n];
- for (int i = 1; i <= n; i++) {
- a[i-1] = scanner.nextInt();
- }
- //размер массива индексов
- int k = scanner.nextInt();
- int[] result=new int[k];
- nextValue:
- for (int i = 0; i < k; i++) {
- int value = scanner.nextInt();
- int left = 0;
- int right = a.length - 1;
- int mid;
- while (left <= right) {
- mid = (left + right) / 2;
- if (a[mid] == value) {
- result[i] = mid + 1;
- continue nextValue;
- } else if (a[mid] < value) {
- left = mid + 1;
- } else {
- right = mid - 1;
- }
- }
- result[i] = -1;
- }
- //!!!!!!!!!!!!!!!!!!!!!!!!! КОНЕЦ ЗАДАЧИ !!!!!!!!!!!!!!!!!!!!!!!!!
- return result;
- }
- public static void main(String[] args) throws FileNotFoundException {
- String root = System.getProperty("user.dir") + "/src/";
- InputStream stream = new FileInputStream(root + "by/it/a_khmelev/lesson04/dataA.txt");
- A_BinaryFind instance = new A_BinaryFind();
- //long startTime = System.currentTimeMillis();
- int[] result=instance.findIndex(stream);
- //long finishTime = System.currentTimeMillis();
- for (int index:result){
- System.out.print(index+" ");
- }
- }
- }
- package by.it.group351004.narivonchik.lesson04;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.util.Arrays;
- import java.util.Scanner;
- /*
- Реализуйте сортировку слиянием для одномерного массива.
- Сложность алгоритма должна быть не хуже, чем O(n log n)
- Первая строка содержит число 1<=n<=10000,
- вторая - массив A[1…n], содержащий натуральные числа, не превосходящие 10E9.
- Необходимо отсортировать полученный массив.
- Sample Input:
- 5
- 2 3 9 2 9
- Sample Output:
- 2 2 3 9 9
- */
- public class B_MergeSort {
- int[] getMergeSort(InputStream stream) throws FileNotFoundException {
- //подготовка к чтению данных
- Scanner scanner = new Scanner(stream);
- //!!!!!!!!!!!!!!!!!!!!!!!!! НАЧАЛО ЗАДАЧИ !!!!!!!!!!!!!!!!!!!!!!!!!
- //размер массива
- //размер массива
- int n = scanner.nextInt();
- //сам массив
- int[] a = new int[n];
- for (int i = 0; i < n; i++) {
- a[i] = scanner.nextInt();
- }
- long startTime = System.currentTimeMillis();
- mergeSortCall(a);
- long finishTime = System.currentTimeMillis();
- System.out.println(finishTime - startTime);
- //!!!!!!!!!!!!!!!!!!!!!!!!! КОНЕЦ ЗАДАЧИ !!!!!!!!!!!!!!!!!!!!!!!!!
- return a;
- }
- public static void mergeSortCall(int[] arr) {
- int[] supArr = Arrays.copyOf(arr, arr.length);
- int left = 0;
- int right = arr.length - 1;
- mergeSort(arr, supArr, left, right);
- }
- public static void mergeSort(int[] arr, int[] supArr, int left, int right) {
- if (left >= right) {
- return;
- }
- int mid = left + (right - left) / 2;
- mergeSort(arr, supArr, left, mid);
- mergeSort(arr, supArr, mid + 1, right);
- merge(arr, supArr, left, mid, mid + 1, right);
- }
- public static void merge(int[] arr, int[] supArr, int left1, int right1, int left2, int right2) {
- System.arraycopy(arr, left1, supArr, left1, right2 + 1 - left1);
- int l = left1;
- int r = left2;
- for (int i = left1; i <= right2; i++) {
- if (l > right1) {
- arr[i] = supArr[r];
- r += 1;
- } else if (r > right2) {
- arr[i] = supArr[l];
- l += 1;
- } else if (supArr[l] < supArr[r]) {
- arr[i] = supArr[l];
- l += 1;
- } else {
- arr[i] = supArr[r];
- r += 1;
- }
- }
- }
- public static void main(String[] args) throws FileNotFoundException {
- String root = System.getProperty("user.dir") + "/src/";
- InputStream stream = new FileInputStream(root + "by/it/a_khmelev/lesson04/dataB.txt");
- B_MergeSort instance = new B_MergeSort();
- //long startTime = System.currentTimeMillis();
- int[] result=instance.getMergeSort(stream);
- //long finishTime = System.currentTimeMillis();
- for (int index:result){
- System.out.print(index+" ");
- }
- }
- }
- package by.it.group351004.narivonchik.lesson04;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.util.Arrays;
- import java.util.Scanner;
- /*
- Рассчитать число инверсий одномерного массива.
- Сложность алгоритма должна быть не хуже, чем O(n log n)
- Первая строка содержит число 1<=n<=10000,
- вторая - массив A[1…n], содержащий натуральные числа, не превосходящие 10E9.
- Необходимо посчитать число пар индексов 1<=i<j<n, для которых A[i]>A[j].
- (Такая пара элементов называется инверсией массива.
- Количество инверсий в массиве является в некотором смысле
- его мерой неупорядоченности: например, в упорядоченном по неубыванию
- массиве инверсий нет вообще, а в массиве, упорядоченном по убыванию,
- инверсию образуют каждые (т.е. любые) два элемента.
- )
- Sample Input:
- 5
- 2 3 9 2 9
- Sample Output:
- 2
- Головоломка (т.е. не обязательно).
- Попробуйте обеспечить скорость лучше, чем O(n log n) за счет многопоточности.
- Докажите рост производительности замерами времени.
- Большой тестовый массив можно прочитать свой или сгенерировать его программно.
- */
- public class C_GetInversions {
- int calc(InputStream stream) {
- //подготовка к чтению данных
- Scanner scanner = new Scanner(stream);
- //размер массива
- int n = scanner.nextInt();
- //сам массив
- int[] a = new int[n];
- for (int i = 0; i < n; i++) {
- a[i] = scanner.nextInt();
- }
- return getInversionsOptimal(a);
- }
- public static int getInversionsOptimal(int[] arr) {
- return mergeSortAndCount(arr, 0, arr.length - 1);
- }
- public static int mergeSortAndCount(int[] arr, int l, int r) {
- int count = 0;
- if (l < r) {
- int m = (l + r) / 2;
- count += mergeSortAndCount(arr, l, m);
- count += mergeSortAndCount(arr, m + 1, r);
- count += mergeAndCount(arr, l, m, r);
- }
- return count;
- }
- static int mergeAndCount(int[] arr, int l,
- int m, int r) {
- int[] left = Arrays.copyOfRange(arr, l, m + 1);
- int[] right = Arrays.copyOfRange(arr, m + 1, r + 1);
- int i = 0, j = 0, k = l, swaps = 0;
- while (i < left.length && j < right.length) {
- if (left[i] <= right[j])
- arr[k++] = left[i++];
- else {
- arr[k++] = right[j++];
- swaps += (m + 1) - (l + i);
- }
- }
- while (i < left.length)
- arr[k++] = left[i++];
- while (j < right.length)
- arr[k++] = right[j++];
- return swaps;
- }
- public static void main(String[] args) throws FileNotFoundException {
- String root = System.getProperty("user.dir") + "/src/";
- InputStream stream = new FileInputStream(root + "by/it/a_khmelev/lesson04/dataC.txt");
- C_GetInversions instance = new C_GetInversions();
- //long startTime = System.currentTimeMillis();
- int result = instance.calc(stream);
- //long finishTime = System.currentTimeMillis();
- System.out.print(result);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement