Консультация № 164622
10.04.2009, 23:45
0.00 руб.
0 7 0
Помогите решить задачу на С ли С++ . Сортировка 2- х мерного массива методом Шелла а потом змейкой слева направо, заранее спасибо

Обсуждение

Неизвестный
14.04.2009, 10:05
общий
То есть, получается, рассматривать двумерный массив как одномерный? Или построчно сортировать?
И еще, метод сортировки "змейкой" не является общеупотребительным - что именно понимается?
Неизвестный
14.04.2009, 13:55
общий
надо построчно сортировать именно 2- х мерный массив, а потм желательно рассортировать полученный массив змейкой слева направо
Неизвестный
14.04.2009, 13:56
общий
ну на крайняк можно и отсортировать одномерный а потом передать в 2-х мерный, хотя бы так.
Неизвестный
14.04.2009, 18:30
общий
Из википедии "Змейка-сортировка, винтовой сепаратор, машина для отделения семян от примесей, различающихся по ... "
Неизвестный
14.04.2009, 20:03
общий
[*,64*] похоже программу никто так мне и не поможет решить


Неизвестный
14.04.2009, 20:32
общий
Да Вы выясните и напишите по-человечески!! Чем ворчать-то! Ведь и у нас нет времени писать что-то как-то.
Про змейку уж молчу - это придумка Вашего преподавателя, видимо. Метод Шелла применяется для одномерного массива (см. мой первый вопрос к Вам). Следовательно, выясните каждую строку по отдельности сортировать? (или слобец?).
Или надо рассматривать все сплошняком. Например, из
Код:
2  12  4
3 10 1
11 7 5

получить нужно:
Код:
1  2  3
4 5 7
10 11 12

Именно это я понимаю "подряд", но ведь можно и так:
Код:
1  4 10
2 5 11
3 7 12

Предложить еще другие возможные варианты? Ещё раз говорю: не ворчите, а уточните
Неизвестный
14.04.2009, 21:58
общий
Прошу прощения за свою несдержанность, просто видимо преподаватель у нас не умеет ладом объяснять. Задача стояла так : отсортировать (именно) 2-х мерный массив полностью и затем записать его в виде змейки. Как одномерный массив то я его отсортировал, но вот проблема не могу переписать теперь этот массив в двухмерный для сортировки его змейкой. (Вот я сидел и думал как же можно отсортировать 2-х мерный массив сразу, т.е логически то это возможно можно было но пришлось – бы вставлять кучу операторов if и for). Если у вас будет время то возможно вы поможете мне перегнать его в 2- мерный. Вот лизин программы.


#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>

//Описание используемых в программе функций.
int shellSort(int a[], int size);
int increment(int inc[], int size);

void main ()
{
int m=0;
int trud, trud2; //Трудоемкость алгоритмов сортировки.
int in_mas [100]; //Целочисленный массив
int in_mas2 [100]; //Копия массива

//Ввод массива
char t [80];
CharToOem ("\nВведите число элементов массива: ", t);
printf("%s", t);
scanf ("%d", &m); //Узнаем размер массива
CharToOem ("\nВведите через пробел целые числа: ", t);
printf("%s", t);
for (int j=0; j<m; j++) scanf ("%d", &in_mas[j]); //Заполнение массива

for (int k=0; k<m; k++) in_mas2[k]=in_mas[k]; //Делаем копию массива
printf ("\n");
printf ("\n");

//Сортировка введеного массива
trud = shellSort (in_mas, m); //Сортировка методом Шелла.

CharToOem ("Сравнений: ", t);
printf("\n%s", t);
printf ("%d\n\n", trud);

getch();
}

//---------------------------------------------------------------------------
//Сортировка Шелла
int shellSort(int a[], int size)
{
char bb [80];
CharToOem ("Сортировка Шелла: \n", bb);
printf("%s", bb);

int inc, i, j, seq[40];
int s;
int trud=0;

// вычисление последовательности приращений
s = increment(seq, size);
while (s >= 0)
{
// сортировка вставками с инкрементами inc[]
inc = seq[s--];

for (i = inc; i < size; i++)
{
int temp = a[i];
for (j = i-inc; (j >= 0) && (a[j] > temp); j -= inc)
a[j+inc] = a[j];
a[j+inc] = temp;
trud++;
}
}
int o = sqrt ( size );
int r = o;
for (int h=0; h<size; h++){ { printf ("%d ", a[h]); //Вывод отсортированного массива
if ( h == o-1 ) {o=o+r; printf ("\n"); }


}}
return trud;
}

//Вспомогательная функция
//вычисляет последовательность приращений
int increment( int inc[], int size)
{
int p1, p2, p3, s; //Объявление переменных.

p1 = p2 = p3 = 1; //Инициализация (присвоение переменным) значений
s = -1;
do {
if (++s % 2) {
inc[s] = 8*p1 - 6*p2 + 1;
} else {
inc[s] = 9*p1 - 9*p3 + 1;
p2 *= 2;
p3 *= 2;
}
p1 *= 2;
} while(3*inc[s] < size);


return s > 0 ? --s : 0;
}


Форма ответа