Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2012, 23:51   #1
ЛетчикАсс
Новичок
Джуниор
 
Регистрация: 27.10.2012
Сообщений: 2
По умолчанию Cортировка матрицы методом пузырька(Си).

Не могу добиться от программы правильной работы со случайно сгенерированными числами любого интервала (от 0 до 10 все норм).
Сама задача: сортировка матрицы методом пузырька.
Помогите плз!

Код:
#include <stdio.h>
#include <stdlib.h>
#define n 10

int main()
{
    int a[n][n],i,j,smena,x,m,p;
    srand(time(NULL));
    x=0;
    m=0;



//заполнение матрицы случайными элементами.
printf("sgenerirovannaya matritsa\n\n\n");
         for(i=0;i<n;i++)
         {
         for(j=0;j<n;j++)
         {
         a[i][j]=rand()%10;
         printf("%d\t",a[i][j]);
         }
         printf("\n");
         }


//замена методом пузырькa.Повторение цикла n^2-1 раз.
for (p=0;p<(n*n-1);p++)
{
    for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
         if(a[i][j]>a[i][j+1])
         {
                if (j!=9)
                { smena=a[i][j];
                a[i][j]=a[i][j+1];
                a[i][j+1]=smena;
                x++;}

                else{ smena=a[i][j];
                a[i][j]=a[i+1][0];
                a[i+1][0]=smena;
                x++;}
                  }
                }
                }
                }
//вывод колличества прогонов цикла.
printf("\n");printf("\n");
printf("poluchennaya matriza\n");
printf("\n");printf("\n");


//вывод матрицы на печать
         for(i=0;i<n;i++)
         {
         for(j=0;j<n;j++)
         {
             printf("%d\t",a[i][j]);
         }
         printf("\n");
         }

printf("\nobshee kollichestvo zamen=%d\n",x);
system("pause");
 return 0;
}

Последний раз редактировалось ЛетчикАсс; 27.10.2012 в 23:53.
ЛетчикАсс вне форума Ответить с цитированием
Старый 28.10.2012, 00:10   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
if (j!=9)
Это зачем тут?
Цитата:
if(a[i][j]>a[i][j+1])
Как по мне правильней было бы так:
if(a[i][j]>a[p][j])

Но думаю самое лучшее использовать указатели, позволяющие превратить твою матрицу в одномерный массив, раз уж матрица у тебя не создается динамически.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2012, 00:27   #3
ЛетчикАсс
Новичок
Джуниор
 
Регистрация: 27.10.2012
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это зачем тут?.
Ну так, если нужно будет поменять, скажем, a[i][9] cо следующим, то
программа будет менять a[i][9] на a[i][10], а такого элемента нет. Или я чего-то не понимаю?


Цитата:
Сообщение от Stilet Посмотреть сообщение
Но думаю самое лучшее использовать указатели, позволяющие превратить твою матрицу в одномерный массив, раз уж матрица у тебя не создается динамически.
А можно, пожалуйста, подробне про переход от матрицы к одномерному массиву?
ЛетчикАсс вне форума Ответить с цитированием
Старый 28.10.2012, 08:27   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Или я чего-то не понимаю?
Угу. Обычно, если испольуется элемент и+1 в цикле, то просто цикл делается до н-1, а не городят лишние операции на каждую итерацию цикла.

Цитата:
А можно, пожалуйста, подробне про переход от матрицы к одномерному массиву?
Вы уверены, что открывали учебник? Что именно подробнее? У вас двумерный массив не динамический = лежит в памяти последовательным куском - приводите тип (заводите другую переменную с того же адреса) и у вас одномерный масив.

Последний раз редактировалось p51x; 28.10.2012 в 08:29.
p51x вне форума Ответить с цитированием
Старый 28.10.2012, 10:29   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
подробне про переход от матрицы к одномерному массиву?
Попробую.
Заводишь две переменки - указатели на тип int. Каждой из них присваиваешь &a[0][0]
Далее два цикла:
Код:
for(int i=0;i<n*n;i++,p++) {
 p2=p;
 for(int j=i;j<n*n;i++,p2++) {
  if(*p>*p2){int q=*p; *p=*p2;*p2=q;}
}}
Где p,p2 - переменки указатели.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива методом пузырька bonjovi Паскаль, Turbo Pascal, PascalABC.NET 8 30.01.2012 20:23
C++, убывание методом пузырька STIFLER32 Общие вопросы C/C++ 2 07.02.2011 01:40
Cортировка матрицы fort-_-minor Общие вопросы C/C++ 4 05.08.2010 13:47
курсач по С++ на тему сортировок методом пузырька и челночным методом ffocus Фриланс 13 05.01.2010 20:20
Сортировка методом пузырька fygas1991 Общие вопросы C/C++ 5 15.11.2009 21:39