Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.143.207] |
|
Сообщ.
#1
,
|
|
|
Разыскивается алгоритм сортировки двухмерного массива по убыванию. ???
С одномерным все просто, а с двухмерным? Заранее посибо... |
Сообщ.
#2
,
|
|
|
как сортировать его? Хоть пример бы привел. Можно ведь и так - и сяк. Вобчем, конечный результат опиши.
|
Сообщ.
#3
,
|
|
|
Цитата murph, 23.05.02, 10:28:56 как сортировать его? Хоть пример бы привел. Можно ведь и так - и сяк. Вобчем, конечный результат опиши. Наверное речь идет о том, что первый элемент (1,1) самый малый, а последний самый большой. Если знаешь как сортировать одномерный массив, то перейди от двумерного к одномерному и сортируй его как хочешь, а потом обратный переход. Перевод работает элементарно и не тебует больших ресурсов. b[l]=a[i,j], где l=i+j*n;для массива размером m x n ;D ;D ;D |
Сообщ.
#4
,
|
|
|
:-/Как сортировать? Обычно! ;D
Есть массив допустим 3 на 2: 5 3 1 8 2 6 4 9 После сортировки он должен иметь вид: 9 8 6 5 4 3 2 1 У меня пока получилось только такое: 8 5 3 1 9 6 4 2 Т.е. в строке сортируется как надо, а в массиве в целом не фига... |
Сообщ.
#5
,
|
|
|
Смотри выше ;D ;D ;D
|
Сообщ.
#6
,
|
|
|
Ну ни фига из твоего алгоритма не понял!
Напиши по подробнее... Можно объяснять на Пальцах/Паскале/С/Бейсике Мой icq:159436883 |
Сообщ.
#7
,
|
|
|
Объясняю еще раз.
Вариант 1 Есть массив [4x2] 0 1 2 3 ------- 0 |5 3 1 8 1 |2 6 4 9 Из него делаем массив. Например 8 имеет индексы [3,0] а в одномерном с формулой которую я писал выше [4*0+3=3] 0 1 2 3 4 5 6 7 -------------- 5 3 1 8 2 6 4 9 И дальше сортируем его Варант 2 do sort=true; min=a[0][0]; for (i=0;i<m;i++) for (j=0;j<n;j++) if (min>a[i][j]) {sort=false;min=a[i][j]; while (sort); |
Сообщ.
#8
,
|
|
|
float *pa=(float*)malloc((m*n)*sizeof(float)); //двумерный массив mxn
доступ к элементу i,j : *(pa+i*m+j) i изменяется от 1 до m, j - от 1 до n Ну и каким-нить пузырьком, как обычный одномерный массив, сортируешь... з.ы. если еще не понятно - пиши...кину код - мало времени щас... |
Сообщ.
#9
,
|
|
|
берешь любой варинат сортировки одномерного массива и меняешь там способ доступа.
везде вместо arr[i] пишешь arrmxn[i/m][i\%n] соответственно i от 0 до m*n-1. только кот будет немножко долго работать. |
Сообщ.
#10
,
|
|
|
Могу предложить совершенно плюшевый, но простой и действенный способ (сомому помогло однажды). Находишь минимальный и максимальный элементы в двухмерном массиве. открываешь цикл от мин до макс, перебираешь все числа в твоем массиве, если находишь таковое, то записываешь его в новый массив. таким образом у тебя в новом массиве все числа из старого, но упорядоченные.
если хочешь подробнее пиши на майл или аськай #145555157 |
Сообщ.
#11
,
|
|
|
Сколько уже можно объяснять. Уже рассказал и показал два самых доступнях варианта. Не ужели не понятно ;D ;D ;D
|
Сообщ.
#12
,
|
|
|
Вот плод моей извращенной фантазии:
Цитата #include <stdio.h> #include <conio.h> #include <time.h> #include <stdlib.h> /*#ifdef NDEBUG #include <windows.h> #endif*/ void sortshell (long num, int *array) // num - число эллементов массива // array - сам массив { long i,j,g; short c; int temp; g = num/2; do { i = g; do { j = i - g; c = 1; do { if (array[j] <= array[j+g]) c = 0; else { temp = array[j]; array[j] = array[j+g]; array[j+g] = temp; } j--; } while(j >= 0 && c); i++; } while(i < num); g /= 2; } while (g > 0); } void printarray(int *iarray, long i1, long i2) // выводим содержимое массива { printf(" "); int i, tmp; for (tmp = 0; tmp < i2; tmp++) printf (" \%3i", tmp+1); printf("\r\n \%c", 218 ); for (i = 0; i < (i2)*5-1; i++) printf("\%c", 196); printf("\r\n "); for (i = 0; i < i1; i++) for (tmp = 0; tmp < i2; tmp++) { if (tmp == 0) printf("\%3i \%c", i+1, 179); printf (" \%3i\%s", iarray[(i*i2)+tmp], ((tmp == i2-1)?"\r\n ":" ")); /*#ifdef NDEBUG Sleep(10); #endif*/ } } void sortmultiarray(int *iarray, long i1, long i2) // сортируем многомерный массив { int i; int max = i1*i2; int *iarray1 = new int[max]; if (!iarray1) { printf("\r\nError... can't allocated memory..."); return; } for (i = 0; i < max; i++) iarray1[i] = iarray[i]; sortshell(max, iarray1); for (i = 0; i < max; i++) { iarray[i] = iarray1[i]; } delete []iarray1; } void main() { const int first = 10; const int second = 10; int iarray[first][second] = {0}; srand((unsigned)time(0l)); for (int y = 0; y < first; y++) for (int x = 0; x < second; x++) iarray[y][x] = (rand() * 999) / RAND_MAX; printarray(iarray[0], first, second); printf("\r\nPress any key to sorting array"); while (!_getch()); printf("\r\n\r\nSorting... Please wait..."); sortmultiarray((int*)iarray, first, second); printf("\r\n\r\nSorted completed\r\n\r\n"); printarray(iarray[0], first, second); printf("\r\nPress any key to continue\r\n"); while (!_getch()); return; } |
Сообщ.
#13
,
|
|
|
Какие в \%\%\%\%\% преобразования индексов? Для компа все многомерные массивы - одномерные. А при таком раскладе (условии сортировки) сам Бог велел!
Объявлеем указатель на одномерный массив размерностью MxN, присваиваем ему адрес двумерного массива. Сортируем этот одномерный массив своим любимым Quick-пузырьком ;D и все - абгемахт! |