Перейти к содержимому

Сервис обмена электронных валют

Выбрать шаблон и создать сайт

Сортировка двумерного массива

#1 Galeodor

Galeodor
  • Пользователь
  • 1 172 сообщений
  • Репутация: 2
0

Отправлено 20 Март 2009 - 19:58

Короч. Двумерный массив.
Размер=пусть будет например 5*5
Наполнение=рандомное.

Решился отсортировать его по возрастанию.
Первое что пришло в голову, перегнать в одномерный, сортирнуть пузырьком, перегнать в двумерный обратно.

Эт ладно, когда массив 5*5, а когда 1000*1000..эт ж я копм замучаю.

Вторая идея, тупо сортирнуть его методом пузырька.(ну там тупо перебирает, переставляет и т.д.).Это как?оптимально? или есть какая хитрая сортировка именно для многомерных массивов,которую и нигде не нашел?

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 20 Март 2009 - 20:46

Приведи пример как толком должен отсортировать.

Двумерный массив понимает под собой строки и столбцы
|| -N- || -1- || -2- || -3- || -4- || -5- ||
------------------------------------------
|| -1- ||  6  |  4  |  2  |  6  |  9  |
------------------------------------------
|| -2- ||  3  |  5  |  9  |  0  |  4  |
------------------------------------------
|| -3- ||  2  |  2  |  7  |  8  |  1  |
------------------------------------------
|| -4- ||  9  |  1  |  0  |  6  |  8  |
------------------------------------------
|| -5- ||  7  |  3  |  2  |  1  |  5  |
------------------------------------------

Как его нужно отсортировать?
  • 0

#3 Galeodor

Galeodor
    Topic Starter
  • Пользователь
  • 1 172 сообщений
  • Репутация: 2

Отправлено 20 Март 2009 - 20:58

...)))))) я конечно не напишу щас всю матрицу


ну типа должно быть

|| -N- || -1- || -2- || -3- || -4- || -5- ||
------------------------------------------
|| -1- || 0 | 0 | 1 | 2 | 2 |
------------------------------------------
|| -2- || 3 | 4 | 4 | 5 | 6 |
------------------------------------------
и т.д. :unsure:
  • 0

#4 Galeodor

Galeodor
    Topic Starter
  • Пользователь
  • 1 172 сообщений
  • Репутация: 2

Отправлено 20 Март 2009 - 21:18

а...слышь, парни, а я могу работать с адресами ячеек памяти? типа если по этому адресу число больше чем по следующему то перставить, и т.д. методом пузырька?
  • 0

#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 21 Март 2009 - 09:52

Galeodor, язык то хоть какой? В php если что нет указателей, если Cи или С++ то можно.

Вот посмотри ссылку, там 3 метода сортировки
_http://www.vzmakh.ru/info/pascal/modules/page14.html

А как ты показал, сортировку можно осуществить только для одномерного массива.
Если ты будешь работать с указателями, то тогда можно и методом пузырька воспользоваться :unsure:
Могу объяснить как будет идти указатель по массиву.
  • 0

#6 Galeodor

Galeodor
    Topic Starter
  • Пользователь
  • 1 172 сообщений
  • Репутация: 2

Отправлено 21 Март 2009 - 11:57

а не пох какой язык? :) мне алгоритм нужен а не решение :)

вот про указатели расскажи плиз, я понял, что они ссылаются на ячейку памяти, при прибавлении const к указателю изменяется не переменная, на которую он ссылается,а адрес ячейки памяти перескакивает на константу.
Можешь либо ссыль дать на указатели с объяснениями, либо тут если не лень :)


  • 0

#7 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 22 Март 2009 - 00:11

вот тут можно почитать подробнее
Введение в язык Си

Мой пример с указателями
int massiv[5] = {5,7,10,16,1}; //объявляем массив
int *point; //объявляем указатель
point = massiv; // передаём указателю адрес на 0 элемент массива, идентично point = &massiv[0]

printf("Выбранное число: %d", *point); // *point - взятие значения по адресу (выведет число 5)

point++; // сдвинули адрес указателья на следующую ячейку

printf("Выбранное число: %d", *point); // выведет число 7

*point++; // прибавили к значению в ячейке 1-ку

printf("Выбранное число: %d", *point); // выведет число 8

То есть в краткости суть.
1) При объявдении указателя нужно указать:
тип_на_который_ссылается *имя_указателя;
2) *имя_указателя - взятие значения по адресу
имя_указателя - адрес на который ссылается указатель
3) Изменил значение в указателе, изменил и зачение переменной, на которую он ссылается.

Прикрепленные изображения

  • points.gif

  • 0

#8 Galeodor

Galeodor
    Topic Starter
  • Пользователь
  • 1 172 сообщений
  • Репутация: 2

Отправлено 22 Март 2009 - 10:37

вот за код с массивом и выводом офигенное спасибо. Все сразу понятно стало.
  • 0

#9 Galeodor

Galeodor
    Topic Starter
  • Пользователь
  • 1 172 сообщений
  • Репутация: 2

Отправлено 22 Март 2009 - 19:52

прошу код проверить. Он работает. все кул. тупо на оптимизацию.

Сортировка массива 3*3 из случайных чисел по возрастанию.
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
void main()
{
int mas[3][3];
int i,j;
clrscr();
randomize();
//заполняю массив из случайных чисел
for (i=0;i<3;++i)
	{
	for (j=0;j<3;++j)
	mas[i][j]=random(100);
	}

//вывожу заполненный несортированный массив
for (i=0;i<3;++i)
	{
	for (j=0;j<3;++j)
	printf("%d\t",mas[i][j]);
printf("\n");
	}
getch();



int *m;
m=&mas[0][0];

//методом пузырька сортирую по возрастанию исходя из того, что число из предыдущей учейки памяти больше чем в следующей ячейке
int a=8;
while (a>=0)
	{
	for (i=0;i<a;++i)

	if (*(m+i)>*(m+i+1))
		{
	int per;
	per=*(m+i+1);
	*(m+i+1)=*(m+i);
	*(m+i)=per;
		}
a--;
	}
//вывожу отсортирный массив
for (i=0;i<3;++i)
	{
	for (j=0;j<3;++j)
	printf("%d\t",mas[i][j]);
printf("\n");
	}
getch();
//конец...
}

  • 0

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Март 2009 - 10:10

В аське с тобой говаорили
1) Вместо твоего while можно использовать for
2) С указателями можно работать как с массивами.
*(m+i) -> m[i]
*(m+i+1) -> m[i+1]

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru