Есть массив значений, каждое значение имеет свой ID. Нужно отсортировать этот массив так, чтобы одинаковые значения были отсортированы по ID. Сейчас я сортирую 2 раза, сперва массив, потом ID. Но по времени не укладываюсь в рамки
Здравствуйте, Glas, Вы писали:
G>Есть массив значений, каждое значение имеет свой ID. Нужно отсортировать этот массив так, чтобы одинаковые значения были отсортированы по ID. Сейчас я сортирую 2 раза, сперва массив, потом ID. Но по времени не укладываюсь в рамки
Здравствуйте, Glas, Вы писали:
G>Есть массив значений, каждое значение имеет свой ID. Нужно отсортировать этот массив так, чтобы одинаковые значения были отсортированы по ID. Сейчас я сортирую 2 раза, сперва массив, потом ID.
В функции сравнения сначала сравниваются значения, а при их равенстве — id. Тогда одной сортировки хватит
Здравствуйте, MBo, Вы писали:
MBo>Здравствуйте, Glas, Вы писали:
G>>Есть массив значений, каждое значение имеет свой ID. Нужно отсортировать этот массив так, чтобы одинаковые значения были отсортированы по ID. Сейчас я сортирую 2 раза, сперва массив, потом ID.
MBo>В функции сравнения сначала сравниваются значения, а при их равенстве — id. Тогда одной сортировки хватит
Если подскажете как это реализовать для алгоритма quicksort, буду премного благодарен.
Здравствуйте, Glas, Вы писали:
G>Здравствуйте, VEAPUK, Вы писали:
VEA>>ID уникальны? Составной ключ?
G>Да, для каждого значения ID уникален, по сути это позиция.
Здравствуйте, Glas, Вы писали:
MBo>>В функции сравнения сначала сравниваются значения, а при их равенстве — id. Тогда одной сортировки хватит
G>Если подскажете как это реализовать для алгоритма quicksort, буду премного благодарен.
"алгоритм quicksort" функцию сравнения принимает? Вот тогда и передавай в него функцию, работающую по описанной схеме.
G>вот реализация алгоритма, int * idx массив ID, куда вставить сравнение?
void Matrix::QuickSort(Matrix matrix, int * idx, int first, int last)
{
//...while (*matrix(i) < p && i <= last) ++i;
while (*matrix(j) > p && j >= first) --j;
//...
}
Здравствуйте, Glas, Вы писали:
G>Есть массив значений, каждое значение имеет свой ID. Нужно отсортировать этот массив так, чтобы одинаковые значения были отсортированы по ID. Сейчас я сортирую 2 раза, сперва массив, потом ID. Но по времени не укладываюсь в рамки
Мда, а причина то оказывается не в том, что сортировка в 2 прохода Тупо все циклы занимают 50% времени, 45% на перемещение данных и 5% на досортировку ID.
Здравствуйте, Glas, Вы писали:
G>Да, для каждого значения ID уникален, по сути это позиция.
1. Если ID — это позиция, значит нельзя менять порядок равных элементов. Т.е. равные элементы остаются в том порядке, в котором они были в исходном массиве. Называется это дело "stable sort" (устойчивая или стабильная сортировка).
Здравствуйте, Буравчик, Вы писали:
Б>1. Если ID — это позиция, значит нельзя менять порядок равных элементов. Т.е. равные элементы остаются в том порядке, в котором они были в исходном массиве. Называется это дело "stable sort" (устойчивая или стабильная сортировка).
Б>2. STL содержит функцию stable_sort(), которая решает данную задачу. http://www.cplusplus.com/reference/algorithm/stable_sort/
Б>3. Некоторые алгоритмы сортировки изначально являются стабильными. Обычный quicksort к таким не относится. Можно выбрать другой: http://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms — смотреть столбец "stable"
Б>4. Алгоритм quicksort можно сделать стабильным. Нужно выбирать такой опорный элемент, чтобы правее него не было других равных ему элементов.
1. да я в терминологии ноль
2. не подходит, так как массив внутри класса.
3. Спасибо за табличку, сейчас себе попробую, что-нибудь подобрать, хотя heapsort почему-то оказался хуже
4. В массиве множество повторяющихся элементов, не подобрать такой элемент.
Здравствуйте, Glas, Вы писали:
G>Здравствуйте, Glas, Вы писали:
G>>Есть массив значений, каждое значение имеет свой ID. Нужно отсортировать этот массив так, чтобы одинаковые значения были отсортированы по ID. Сейчас я сортирую 2 раза, сперва массив, потом ID. Но по времени не укладываюсь в рамки
G>Мда, а причина то оказывается не в том, что сортировка в 2 прохода Тупо все циклы занимают 50% времени, 45% на перемещение данных и 5% на досортировку ID.
Тогда сортиру только внешний массив с индексами перестановок.
Здравствуйте, minorlogic, Вы писали:
M>Реализация кстати довольно слабая, может возьмете готовую ? может даже intro_sort ?
Я сейчас все сортировки перебирать буду. Вообще из matlaba бы реализацию вытащить. Там этот массив быстрее на порядок сортируется.
Здравствуйте, Glas, Вы писали:
G>Здравствуйте, Буравчик, Вы писали:
Б>>2. STL содержит функцию stable_sort(), которая решает данную задачу. http://www.cplusplus.com/reference/algorithm/stable_sort/
G>2. не подходит, так как массив внутри класса.