qsort в cstdlib будет работать. Массив имеет тип данных *** data.
Итак, во-первых, допустим, вы хотите отсортировать первый индекс массива. Вам нужно написать функцию сравнения для сравнения двух типов данных ****. Компаратор должен возвращать значение меньше нуля, если ab.
int myComparator(void *a, void *b){
Datatype ****c=(Datatype****)a; Datatype ****d=(Datatype****)b
return algorithmRatingFunction(b)-algorithmRatingFunction(a);
}
Это, очевидно, неэффективно, потому что вам нужно переоценивать алгоритм для каждого набора данных при каждом сравнении, но давайте вернемся к этому через секунду. После того, как у вас есть компаратор, вы можете отсортировать массив:
qsort(data,35,sizeOf(Datatype),myComparator);
Вот и все!
Тогда возникает проблема неэффективности ... Если для алгоритма алгоритма RatingFunction требуется много времени (что, я полагаю, так и есть), то вам нужно вычислить все 35 алгоритмов один раз и только один раз. Что вы можете сделать, это рассчитать баллы заранее:
int scores[35];
for(int n=0;n<35;n++)
scores[n]=algorithmRatingFunction(data[n]);
Затем создайте еще один упорядоченный массив целых чисел:
int ordering[35];
for(int n=0;n<35;n++)
ordering[n]=n;
Таким образом, состояние «порядок» соответствует порядку вашего набора данных. Затем вы можете создать новый компаратор:
int myFasterComparator(void *a, void *b){
int c=*(int*)a; int d=*(int*)b
return scores[c]-scores[d];
}
И позвоните при заказе:
qsort(ordering,35,sizeOf(int),myFasterComparator);
Затем восстановите массив, используя порядок. вот так:
Datatype ****ordereddata[35];
for(int n=0;n<35;n++)
ordereddata[n]=data[ordering[n]];
То же самое относится ко всем остальным уровням. Как и в опубликованном dasblinkenlight, qsort уменьшает проблему сортировки 5d-массивов по сравнению со сравнением двух 4d-массивов. Поэтому вместо сортировки каждого 4-мерного массива вам просто нужно сравнить два 3D-массива и т. Д.