Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.66
LiLi R.
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 82
#1

Сортировка Шелла - C++

15.04.2010, 18:11. Просмотров 5568. Ответов 34
Метки нет (Все метки)

Ребят помогите. есть матрица нужно отсортировать каждую строчку матрицы по убыванию алгоритмом Шелла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
 
ifstream in("input.txt");
ofstream out("output.txt");
 
struct mas
{
    int ses[5];
    int key;
    void print();
};
void sort(mas *a, int n)
{
    mas temp;
    int i,j, incr=n/2;
    while (incr>0)
    {
        for (i=incr; i<n; i++)
        {
            j=i-incr;
            while (j>=0)
                if (a[j].key>a[j+incr].key)
                { temp=a[j]; a[j]=a[j+incr]; a[j+incr]=temp; j=j-incr;}
                else j=-1;
        }
        incr=incr/2;
    }
}
int main()
{
    int n,m,i,j;
    int a[10][10];
    in>>n>>m;
    for (i=0; i<n; i++)
        for (j=0; j<m; j++)
            in>>a[i][j];
    int b[10];
    for (j=0; j<m; j++)
    {
        for (i=0; i<n; i++) b[i]=a[i][j];
        sort (b,n);
        for (i=0; i<n; i++) a[i][j]=b[i];
    }
    out<<n<<'t'<<m<<'\n';
    for (j=0; i<n; i++)
    {
        for (j=0; j<m; j++)
            out<<setw(5)<<a[i][j];
        out<<'\n';
    }
    in.close(); out.close();
    system("PAUSE");
return 0;
}
Не знаю как решить проблему. Хеееелп.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2010, 18:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка Шелла (C++):

Сортировка Шелла. Написал программу, не могу понять, почему сортировка не выполняется - C++
Программа создает динамический массив с рандомным заполнением. Дальше выбор сортировок, пузырьком или сортировка Шелла. Вот она то и не...

Сортировка Шелла и пирамидальная сортировка для символов - C++
Здраствуйте, можете пожалуйста привести пример сортировок шелла и пиромидальной сортировки для символов, а то ничего не могу ...

Сортировка Шелла и сортировка вставками - C++
Напишите программу для: 1)Сортировка вставкой 2)сортировка Шелла

Пирамидальная сортировка и сортировка Шелла - C++
Ребята помогите пожалуйста, я NEWBIE и не могу решить такая задача : Выполнить сортировку по убыванию. Пирамидальная сортировка и...

сортировка шелла - C++
помогите с задачей масив 10000 елементов , упорядочить его отрицательные значения по увеличениию, посчитать количество сравнений и...

Сортировка Шелла - C++
Здраствуйте! Обьясните пожалуйста сортировку Шелла ну или хотя бы скиньте код самой сортировки.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,280
23.04.2010, 02:19 #16
если объявить переменную в фигурных скобках (цикле, ф-цие), то после того, как программа выйдет из этих скобок действие переменной прекратится (память, выделенная под нее освобождается)
C
1
2
3
4
5
{
    int i = 0;
    //переменная i действительна
}
//здесь переменная i уже недействительна
поищите: область видимости (действия) переменных
LiLi R.
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 82
23.04.2010, 08:31  [ТС] #17
Vorona,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
 
ifstream in("input.txt");
ofstream out("output.txt");
 
void SortShell(int* arr, int size) {
  int step = size / 2;
  while (step != 0) {
    for (int i = step; i < size; ++i) {
      int tmp = arr[i];
      int j;
      for (j = i - step; j >= 0 && arr[j] > tmp; j -= step)
        arr[j+step] = arr[j];
 
      arr[j+step] = tmp;
    }    
    step /= 2;
  }
}
 
int main()
{
    int** matrix;  
    int   n,m,i,j,a;
        in>>n>>m;
        for (int i = 0; i<n; ++i)
        for (int j = 0; j<m; j++) 
            SortShell(matrix[i], m);
                in>>a[n][m];
        int b[10];
        for (j=0; j<m; j++)
        {
                for (i=0; i<n; i++) b[i]=a[i][j];
                sort (b,n);
                for (i=0; i<n; i++) a[i][j]=b[i];
        }
        out<<n<<'t'<<m<<'\n';
        for (j=0; i<n; i++)
        {
                for (j=0; j<m; j++)
                        out<<setw(5)<<a[i][j];
                out<<'\n';
        }
        in.close(); out.close();
        system("PAUSE");
return 0;
}
Попробовала вот так ошибка error C2109: subscript requires array or pointer type 36 строка
Darky
Быдлокодер
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
23.04.2010, 10:24 #18
А зачем в одномерный массив матрицу превращать?
Просто передаешь как
matrix[i][0], например. Еще раз позволю себе напомнить - у тебя функция называется не sort(37 строка), а SortShell
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,280
23.04.2010, 11:57 #19
в 27 строке вы объявили i и j, следовательно, в 29 и 30 строках этого делать уже не нужно, т.к. эти переменные действуют на протяжении работы всей ф-ции main и получается, что вы их повторно объявляете, что несомненно приводит к ошибке)
LiLi R.
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 82
23.04.2010, 14:10  [ТС] #20
Vorona,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
 
ifstream in("input.txt");
ofstream out("output.txt");
 
void SortShell(int* arr, int size) {
  int step = size / 2;
  while (step != 0) {
    for (int i = step; i < size; ++i) {
      int tmp = arr[i];
      int j;
      for (j = i - step; j >= 0 && arr[j] > tmp; j -= step)
        arr[j+step] = arr[j];
 
      arr[j+step] = tmp;
    }    
    step /= 2;
  }
}
 
int main()
{
    int** matrix;  
    int   n,m,;
        in>>n>>m;
        for (int i = 0; i<n; ++i)
        for (int j = 0; j<m; j++) 
            SortShell(matrix[i], m);
                in>>a[i][0];
        int b[10];
        for (j=0; j<m; j++)
        {
                for (i=0; i<n; i++) b[i]=a[i][j];
                SortShell (b,n);
                for (i=0; i<n; i++) a[i][j]=b[i];
        }
        out<<n<<'t'<<m<<'\n';
        for (j=0; i<n; i++)
        {
                for (j=0; j<m; j++)
                        out<<setw(5)<<a[i][j];
                out<<'\n';
        }
        in.close(); out.close();
        system("PAUSE");
return 0;
}
Все равно неопределены a,i,j
Darky
Быдлокодер
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
23.04.2010, 16:07 #21
Vorona, Там ошибки нет.
LiLi R., Так и понятно. Посмотрите в тело функции - Вы оперируете переменными, которых даже не задали! И я об этом уже говорил.
Вот тоже самое - придумать свое слово и упорно использовать его, причем никто понимать тебя не будет. А вот если ты возьмешь словарь и впишешь его туда, то потом можешь тыкать незнающих носом, и они будут знать его значение. Объявите в теле функции или глобальные переменные, которых не хватает.
LiLi R.
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 82
23.04.2010, 19:56  [ТС] #22
Darky, обьявила. теперь 3 ошибки одного типа
error C2109: subscript requires array or pointer type 43 45 51 строка
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,280
23.04.2010, 20:16 #23
работу алгоритма не проверял и не компилировал, вместо a стоило написать matrix, или объявить a, как двумерный массив
еще нужно было динамически выделить вначале и удалить по окончанию работы программы память под matrix
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
 
ifstream in("input.txt");
ofstream out("output.txt");
 
void SortShell(int* arr, int size) {
        int step = size / 2, tmp, j;
        while (step != 0) {
                for (int i = step; i < size; ++i) {
                        tmp = arr[i];
                        for (j = i - step; j >= 0 && arr[j] > tmp; j -= step)
                                arr[j+step] = arr[j]; 
                        arr[j+step] = tmp;
                }    
                step /= 2;
        }
}
 
int main()
{
        int** matrix;  
    int   n, m, i, j;
        in>>n>>m;
    matrix = new int*[n];
    for(i = 0; i < n; i++)
        matrix[i] = new int[m];
        for (int i = 0; i<n; ++i)
                for (int j = 0; j<m; j++) 
                        SortShell(matrix[i], m);
        in>>matrix[i][0];
        int b[10];
        for (j=0; j<m; j++)
        {
                for (i=0; i<n; i++) b[i]=matrix[i][j];
                SortShell (b,n);
                for (i=0; i<n; i++) matrix[i][j]=b[i];
        }
        out<<n<<'t'<<m<<'\n';
        for (j=0; i<n; i++)
        {
                for (j=0; j<m; j++)
                        out<<setw(5)<<matrix[i][j];
                out<<'\n';
        }
        in.close(); out.close();
    for(i = 0; i < n; i++)
            delete []matrix[i];
    delete []matrix;
        system("PAUSE");
return 0;
}
и насчет чтения из файла неясно in>>n>>m;
LiLi R.
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 82
23.04.2010, 21:41  [ТС] #24
Vorona, программа компилется но при запуске ошибку выдает...
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.04.2010, 21:50 #25
LiLi R., еще бы, matrix используется без инициализации элементов.
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,280
23.04.2010, 22:36 #26
вставьте этот кусок после выделения памяти (после 29 строки)
здесь происходит присваивание значений, путем ввода их с клавиатуры, элементам матрицы
C++
1
2
3
4
5
for(i = 0; i < n; i++)
        for(j = 0; j < m; j++){
                cout << '[' << i << '][' << j << "]: ";
                cin >> matrix[i][j];
        }
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.04.2010, 22:49 #27
Vorona, сюда по коду приведенному в первом посте, матрицу необходимо читать из файла.
LiLi R.
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 82
23.04.2010, 23:39  [ТС] #28
Vorona, Да по задаче есть input.txt там матрица. как сделать так чтоб прога считала из файла?
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,280
24.04.2010, 02:35 #29
вот на си навоял минимально, видел, что вы и размеры матрицы из файла берете, так вот:
первые два числа в файле - размеры матрицы, остальные числа, каким бы образом ни были записаны они будут размещены относительно этих размеров...
никаких проверок на действительность кол-ва чисел относительно размеров матрицы не делал, просто посмотрите и разберитесь с этим:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <cstdio>
#include <conio.h>
#include <cstring>
#include <malloc.h>
 
#define size 3000
 
int main(){
    int i;
    char buf[size];
    for(i = 0; i < size; i++)
        buf[i] = 0;
 
    FILE* in;
    if(!(in = fopen("input.txt", "r")))
        printf("Reading error");
 
    for(i = 0; i < size; i++)
        fscanf(in, "%d", &buf[i]);
    
    for(i = 0; i < strlen(buf); i++)
        printf("%d ", buf[i]);
    printf("\n\n");
    
    int j, x;
    int n = buf[0];
    int m = buf[1];
    int **matrix = (int**)malloc(n*sizeof(int*));
    for(i = 0; i < n; i++)
        matrix[i] = (int*)malloc(m*sizeof(int));
 
    x = 2;
    for(i = 0; i < n; i++)
        for(j = 0; j < m; j++)
            matrix[i][j] = buf[x++];
 
    for(i = 0; i < n; i++){
        for(j = 0; j < m; j++)
            printf("%d\t", matrix[i][j]);
        printf("\n");
    }
 
    for(i = 0; i < n; i++)
        free(matrix[i]);
    free(matrix);
 
    fclose(in);
    getch();
    return 0;
}
здесь:
выводим на экран все числа в файле
3 и 4 обозначили ее размерность и дальше числа выстраиваются в матрицу 3х4...
Миниатюры
Сортировка Шелла  
LiLi R.
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 82
25.04.2010, 20:22  [ТС] #30
Vorona, Все просто супер. Малюсенький вопрос и се - как результат вывести не в проге а в файл output.txt?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2010, 20:22
Привет! Вот еще темы с ответами:

Сортировка Шелла - C++
Поделитесь пожалуйста исходником программы которая сортирует одномерный массив методом Шелла, что бы количество и значение элементов...

Сортировка Шелла - C++
//Сортировка Шелла void Shell(int **matr, int n1) { for( i=0;i&lt;n1;i++) { printf(&quot;Введет элемент равный в строке номер ...

Сортировка Шелла - C++
В алфавитном порядке по фамилии алгоритмом Шелла #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; ...

Сортировка Шелла 2 - C++
Не могу понять в чём ошибка компиляции, подскажите пожалуйста) #include &lt;malloc.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.04.2010, 20:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru