107 / 107 / 9
Регистрация: 19.12.2010
Сообщений: 417

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

07.02.2013, 04:25. Показов 1135. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru