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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2013, 09:57   #1
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию Сортировка массива

Доброго дня Уважаемые программисты! Нужна Ваша помощь!
Бьюсь уже давно, никак не могу сделать...
Имеется массив чисел 1234567. Мне необходимо построить матрицу путем сортировки этих чисел следующим образом:
1234567
1234576
1234756
1234765
1234675 и т.д. пока она не достигнет значения 7654321

Массив объявляю как
int n[7];
int n_ar[j][7]; j- число строк

Помогите плиззз с полным кодом

Заранее спасибо!
Pir вне форума Ответить с цитированием
Старый 21.11.2013, 11:39   #2
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

А зачем вам двумерный массив? Вроде у вас одномерный массив задается и просто сортируется

- каждый раз начинаешь с конца массива;
- если i="последний_элемент_массива", то сравниваем как-то так:
Код:
  int i=0;
  //end = последний_элемент_массива;
  //int i = end;
while (i >= 0){
  if (n[i]>n[i-1])
 {
 int par = n[i-1];
 n[i-1] = n[i];
 n[i] = par;
 i=end;
 }
else 
 i--;
}
т.е. если поменяли - начали сначала(тобишь с конца), если менять не нужно - идем дальше. Ну и т.д.

+ если нужно, при каждой итерации выводи массив свой.

UPDATE:
А ты уверен, что последовательность такая:
Цитата:
1234567
1234576
1234756
1234765
1234675
шестерка с семеркой местами меняются точно?

Последний раз редактировалось Baburek; 21.11.2013 в 11:49.
Baburek вне форума Ответить с цитированием
Старый 21.11.2013, 11:51   #3
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Да, последовательность нужна именно такая
Pir вне форума Ответить с цитированием
Старый 21.11.2013, 12:37   #4
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
...
1234765
1234675
...
А потом как не знаете?
Baburek вне форума Ответить с цитированием
Старый 21.11.2013, 12:57   #5
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Знаю, вот первые 50 строчек

1 1 2 3 4 5 6 7
2 1 2 3 4 5 7 6
3 1 2 3 4 7 5 6
4 1 2 3 4 7 6 5
5 1 2 3 4 6 7 5
6 1 2 3 4 6 5 7
7 1 2 3 5 4 6 7
8 1 2 3 5 4 7 6
9 1 2 3 5 7 4 6
10 1 2 3 5 7 6 4
11 1 2 3 5 6 7 4
12 1 2 3 5 6 4 7
13 1 2 3 6 4 5 7
14 1 2 3 6 4 7 5
15 1 2 3 6 7 4 5
16 1 2 3 6 7 5 4
17 1 2 3 6 5 7 4
18 1 2 3 6 5 4 7
19 1 2 3 7 4 5 6
20 1 2 3 7 4 6 5
21 1 2 3 7 6 4 5
22 1 2 3 7 6 5 4
23 1 2 3 7 5 6 4
24 1 2 3 7 5 4 6
25 1 2 4 3 5 6 7
26 1 2 4 3 5 7 6
27 1 2 4 3 7 5 6
28 1 2 4 3 7 6 5
29 1 2 4 3 6 7 5
30 1 2 4 3 6 5 7
31 1 2 4 5 3 6 7
32 1 2 4 5 3 7 6
33 1 2 4 5 7 3 6
34 1 2 4 5 7 6 3
35 1 2 4 5 6 7 3
36 1 2 4 5 6 3 7
37 1 2 4 6 3 5 7
38 1 2 4 6 3 7 5
39 1 2 4 6 7 3 5
40 1 2 4 6 7 5 3
41 1 2 4 6 5 7 3
42 1 2 4 6 5 3 7
43 1 2 4 7 3 5 6
44 1 2 4 7 3 6 5
45 1 2 4 7 6 3 5
46 1 2 4 7 6 5 3
47 1 2 4 7 5 6 3
48 1 2 4 7 5 3 6
49 1 2 5 3 4 6 7
50 1 2 5 3 4 7 6

Суть такая...берется последняя цифра (7)и перемещается справа налево до 3-его разряда(справа), потом следующая цифра (6) и т. д.
Pir вне форума Ответить с цитированием
Старый 21.11.2013, 14:10   #6
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от Pir Посмотреть сообщение
Суть такая...берется последняя цифра (7)и перемещается справа налево до 3-его разряда(справа), потом следующая цифра (6) и т. д.
Если дословно как вы говорите - все зациклится на том, что мы перебираем последние три элемента массива)

Как минимум на шаге (6) в описанной вами последовательности уже взяли не последний элемент массива:

Код:
...
(6) 1 2 3 4 6 5 7 
(7) 1 2 3 5 4 6 7 
...

Последний раз редактировалось Baburek; 21.11.2013 в 14:14.
Baburek вне форума Ответить с цитированием
Старый 21.11.2013, 14:17   #7
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Потом начинает перемещаться цифра 4. Когда исчерпаются все варианты с 4 потом бегает цифра 3. Всего будет 5040 строк. Последняя 7654321
Pir вне форума Ответить с цитированием
Старый 21.11.2013, 16:01   #8
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Сейчас нет времени "пописать" и "потестить", но если мы перебираем то я бы 100% где-то хранил уже встретившиеся ранее варианты(чтобы их отбрасывать в дальнейшем):

Код:
bool check(int n[7])
{
 for (int i=0; i<7; i++) str=str+n[i];
 for (int i=0; i<x->Length(); i++){
      if (x[i]==str) {str=""; return true;} //значит уже попадалась такая комбинация
 }
 x[cnt]=str; //новую комбинацию сохраним на будущее и пойдем дальше
 cnt++;
 str="";
 return false; 
}
Просто как мысль. Так мы переберем все ваши варианты без повторений. Останется только порядок соблюсти нужный.

Кое-что написал "по ходу мысли", но это еще окончательный вариант для вас. Я беру перебираю последовательность 1234567 и вывожу первые 50 удовлетворяющих уникальности результатов, но порядок не соблюден. Общая идея такова:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#pragma hdrstop
int end, cnt, limit;
AnsiString str;
AnsiString x[50];
bool check(int n[7]);

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
int k=1;
limit=3;
int i;
int n[7];
int cof=0;
cnt = 0;

for (i=0; i<7; i++){
	n[i]=i+1;
	end = i;
        cout << n[i];
}

cout << endl;
i=end;

while (i >= 0){
if (cnt>=50) break;
  if (k<limit)
 {
 int par = n[i-1];
 n[i-1] = n[i];
 n[i] = par;

 if ( check(n) && limit<7) {limit++; }
 else{
 for (int p=0; p<7; p++)
       cout << n[p];
 cout<<endl;

 }

 k++;
 i--;
 }
else {
 if (end>0) i=end;
 k=1;
 }
}
system("pause");
        return 0;
}

bool check(int n[7])
{
 for (int i=0; i<7; i++) str=str+n[i];
 for (int i=0; i<x->Length(); i++){
      if (x[i]==str) {str=""; return true;}
 }
 x[cnt]=str;
 cnt++;
  str="";
 return false;
}
//---------------------------------------------------------------------------
Baburek вне форума Ответить с цитированием
Старый 03.12.2013, 13:07   #9
Pir
Пользователь
 
Регистрация: 09.07.2013
Сообщений: 18
По умолчанию

Что то не получается..можете посмотреть полный код?
Pir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
Сортировка массива. Soeth Помощь студентам 1 20.02.2012 10:48
Сортировка массива методами предсортировки и слияния, и пирамидальная сортировка. lenny_24 Помощь студентам 2 17.04.2011 18:57
с++ сортировка массива ioda1986 Общие вопросы C/C++ 13 07.03.2010 19:32
Сортировка массива saggy Помощь студентам 2 27.02.2010 14:07