Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
107 / 107 / 9
Регистрация: 19.12.2010
Сообщений: 417

Метод совместной сортировки нескольких массивов в соответствии с одним из массивом

07.02.2013, 04:25. Показов 1148. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Пытаюсь написать метод, который принимает множество разнотипных массивов (назовём их sortArrays) и номер сортируемого массива (назовём его sortArrayIndex). Этот метод должен взять из sortArrays массив под номером sortArrayIndex (назовём его sortingArray) и начать сортировать его (методом быстрой сортировки), попутно меняя местами элементы с теми же индексами в остальных массивах.
Пример
Есть массив строк (stringArray):
Строка 3
Строка 1
Строка 2
Есть массив чисел (intArray):
2
1
3
Тогда sortArrays = {stringArray, intArray}
Пусть sortArrayIndex = 1, тогда sortingArray это intArray.
Теперь метод сортирует intArray, используя быструю сортировку, и меняет местами элементы с теми же индексами в stringArray.
После окончания работы метода, массивы будут выглядеть так:
Массив чисел (intArray):
1
2
3
Массив строк (stringArray):
Строка 1
Строка 3
Строка 2
Если бы sortArrayIndex был бы равен 0, тогда sortingArray был бы stringArray и именно он бы сортировался, а в intArray всего-лишь бы менялись элементы с соответствующими индексами.
Тогда после окончания работы метода, массивы будут выглядеть так:
Массив строк (stringArray):
Строка 1
Строка 2
Строка 3
Массив чисел (intArray):
1
3
2
Только метод должен работать для любых типов массивов, а не только для string и int
Мои наработки
Я начал использовать varargs в Java
и написал примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Arrays {
    public static void quickSortTogether(int sortingArrayIndex, int low,
            int high, Object[]... sortingArrays) {
        Object[] sortingArray = sortingArrays[sortingArrayIndex];
        int i = low;
        int j = high;
        Object x = sortingArray[(low + high) / 2];
        do {
            while (sortingArray[i] < x)
                ++i;
            while (sortingArray[j] > x)
                --j;
            if (i <= j) {
                //Обмен элементов с индексами i и j во всех массивах sortArrays
                for (int sortingArraysIter = 0; sortingArraysIter < sortingArrays.length; sortingArraysIter++) {
                    Object[] exchangingArray = sortingArrays[sortingArraysIter];
 
                    Object temp = exchangingArray[i];
                    exchangingArray[i] = exchangingArray[j];
                    exchangingArray[j] = temp;
                }
 
                i++;
                j--;
            }
        } while (i < j);
        if (low < j)
            quickSortTogether(sortingArrayIndex, low, j, sortingArrays);
        if (i < high)
            quickSortTogether(sortingArrayIndex, i, high, sortingArrays);
    }
 
    public static void quickSortTogetherTest() {
        String[] stringArray = new String[] { "Строка 3", "Строка 1",
                "Строка 2" };
        Integer[] intArray = new Integer[] { 2, 1, 3 };
        quickSortTogether(0, 0, intArray.length - 1, stringArray, intArray);
    }
}

Но проблема в том, что операторы <, > и = не определены для Object, тогда
использовал Comparable вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.lang.Comparable;
 
public class Arrays {
    public static void quickSortTogether(int sortingArrayIndex, int low,
            int high, Comparable[]... sortingArrays) {
        Comparable[] sortingArray = sortingArrays[sortingArrayIndex];
        int i = low;
        int j = high;
        Comparable x = sortingArray[(low + high) / 2];
        do {
            while (sortingArray[i].compareTo(x) < 0)
                ++i;
            while (sortingArray[j].compareTo(x) > 0)
                --j;
            if (i <= j) {
                //Обмен элементов с индексами i и j во всех массивах sortArrays
                for (int sortingArraysIter = 0; sortingArraysIter < sortingArrays.length; sortingArraysIter++) {
                    Comparable[] exchangingArray = sortingArrays[sortingArraysIter];
 
                    Comparable temp = exchangingArray[i];
                    exchangingArray[i] = exchangingArray[j];
                    exchangingArray[j] = temp;
                }
 
                i++;
                j--;
            }
        } while (i < j);
        if (low < j)
            quickSortTogether(sortingArrayIndex, low, j, sortingArrays);
        if (i < high)
            quickSortTogether(sortingArrayIndex, i, high, sortingArrays);
    }
 
    public static void quickSortTogetherTest() {
        String[] stringArray = new String[] { "Строка 3", "Строка 1",
                "Строка 2" };
        Integer[] intArray = new Integer[] { 2, 1, 3 };
        quickSortTogether(0, 0, intArray.length - 1, stringArray, intArray);
    }
}

Но мне не нравится этот способ с Comparble, поскольку все стандартные типы придётся оборачивать в классы (использовать Integer вместо int, Long вместо long и т.д.), да и, походу, он не будет работать, поскольку как мы можем повторно вызвать quickSortTogether и передать ему varargs sortArrays...?
Может быть, у Вас есть идеи, как реализовать такой метод лучше? И, вообще, возможно ли реализовать такое на Java?
Сделать отдельный класс, который будет содержать по одному элементу из каждого массива, и сортировать уже массив из экземпляров этого класса не подходит ввиду ограничений по времени и памяти.
P.S. А вообще, разрабатываю этот метод, как один из вариантов решения этой задачи: Быстрый поиск строки в списке строк
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2013, 04:25
Ответы с готовыми решениями:

Параллельный вывод строки нескольких массивов с одним индексом
Возможно ли реализовать вывод нескольких двумерных массивов параллельно? То есть итерации для них общие. Чтобы при первой итерации...

Методы сортировки массивов.Метод пузырьковый
Метод пузырьковый nLeft 600 nRight 1600 Помогите сделать Зарание Благодарю.

Метод для изменения нескольких массивов
Нужно сделать метод который добавляет заданное число к каждому элементу всех переданных массивов. Массивы могут быть как типа int, так и...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2013, 04:25
Помогаю со студенческими работами здесь

Сравнение методов сортировки массивов: метод прямого включения и Шелла
Задание: Написать учебно-демонстрационную программу, которая сравнивает методы прямого включения и Шелла сортировки массивов.Очень срочно...

Ребят как переделать метод сортировки пузырьком на метод сортировки простым выбором
public void SortPuzirek(int mass, int Size) // метод, выполняющий сортировку методом пузырька { int metka, obmen =...

Отсортировать одним из методов элементы массива в соответствии с заданием
Создайте массив, содержащий 20 целых чисел. Отсортируйте его по возрастанию. После этого определите и выведите на экран сумму элементов с...

Отсортировать одним из методов элементы массива в соответствии с заданием
Создайте массив А, содержащий 8 различных символов. Отсортируйте его по возрастанию. Организуйте и выведите на экран целочисленный...

Метод медиан из трех элементов VS улучшенный быстрый метод сортировки(метод Бентли-Макилроя)
Здравствуйте! Дали весьма интересное задание. Сравнить два вышеуказанных метода сортировки для массива из 10000 элементов, результаты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru