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

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

Войти
Регистрация
Восстановить пароль
 
Krol
0 / 0 / 0
Регистрация: 07.02.2010
Сообщений: 49
#1

Методы сортировки - C++

19.09.2011, 18:41. Просмотров 660. Ответов 11
Метки нет (Все метки)

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

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include<stdio.h>
#include<locale.h>
#include<time.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define SWAP(A, B) { int t = A; A = B; B = t; }
int razmer = 0, vibor, vibor2, temp, k, t, last, left, right, obmen = 0, sravnenie = 0, * s, i, j = 0; char y,n;
void randomMassiv ()
{
    system("cls");
    srand ( unsigned( time ( NULL) ) );
    for( i = 0; i < razmer; i++)     
    {
        s[i] = (rand()%500);
        printf ("%d\n",s[i]);
    }
}
void incrMassiv ()
{
    system("cls");
    for( i=0; i<=razmer; i++)     
    {
        s[i]=i+100;
        printf("%d  \n",s[i]);
    }
}
void decrMassiv ()
{
    system("cls");
    for( i=500,k=0; i>500-razmer; i--,k++)     
    {
        s[k]=i;
        printf("%d  \n",s[k]);
    }
}
void insertVstavkaSort ()
{
    for ( i=1; i < razmer; i++) 
    {                           // цикл проходов, i - номер прохода
        temp = s[i];            // поиск места элемента в готовой последовательности 
        for ( j=i-1; j>=0 && s[j] > temp; j--)
        { 
            sravnenie++;
            s[j+1] = s[j];      // сдвигаем элемент направо, пока не дошли
            obmen++;
        }                       
                            // место найдено, вставить элемент
        s[j+1] = temp;
        sravnenie++;
    }
        for (k=0;k<razmer;k++)
        {
                printf ("%d\t",s[k]);
        }
        printf("\nСравнений: %d\nОбменов: %d\nСумма сравнений и обменов: %d\n",sravnenie,obmen,sravnenie+obmen);
}
void insertBubbleSort ()
{
    for (i = razmer - 1; i > 0; i--)
    {
        for (j = 0; j < i; j++)
        {
            sravnenie++;
            if (s[j] > s[j + 1]) 
            {
                SWAP( s[j], s[j + 1] );
                obmen++;
            }
        }
    }
    for (k=0;k<razmer;k++)//вывод отсортированного массива
    {
        printf ("%d\t",s[k]);
    }
    printf("\nСравнений: %d\nОбменов: %d\nСумма сравнений и обменов: %d\n",sravnenie,obmen,sravnenie+obmen);
}
int main ()
{   
    setlocale(LC_CTYPE,"rus");
    system("cls");
    printf("Введите размерность массива:\n");
    scanf("%d",&razmer);
    s = (int *)calloc(razmer, sizeof(int));
    system("cls");
    printf("Выберите нужный тип массива:\n");
    printf("1. Случайный массив\n");
    printf("2. Отсортированный по возрастанию\n");
    printf("3. Отсортированный по убыванию\n");
    scanf ("%d",&vibor);
    switch (vibor)
    {
    case 1:
        {
            randomMassiv();
            break;
        }
    case 2:
        {
            randomMassiv();
            printf ("\n");
            incrMassiv();
            break;
        }
    case 3:
        {
            randomMassiv();
            printf ("\n");
            decrMassiv();
            break;
        }
    }
    // SORTIROVKA
    system ("cls");
    printf ("Выберите метод сортировки\n\n");
    printf ("1. Метод простых включений\n\n");
    printf ("2. Метод пузырька\n");
    scanf ("%d",&vibor2);
    switch (vibor2)
    {
    case 1:
        {
            randomMassiv();
            printf ("\n");
            insertVstavkaSort();
            break;
        }
    case 2:
        {
            randomMassiv();
            printf ("\n");
            insertBubbleSort ();
            break;
        }
    }
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zalogic
146 / 142 / 2
Регистрация: 12.12.2010
Сообщений: 265
19.09.2011, 18:50     Методы сортировки #2
ну например в твоей функции
C++
1
void insertBubbleSort ()
если написать:
C++
1
 if (s[j] < s[j + 1])
то по убыванию отсортирует.
Миниатюры
Методы сортировки  
Krol
0 / 0 / 0
Регистрация: 07.02.2010
Сообщений: 49
19.09.2011, 18:59  [ТС]     Методы сортировки #3
Цитата Сообщение от zalogic Посмотреть сообщение
ну например в твоей функции
C++
1
void insertBubbleSort ()
если написать:
C++
1
 if (s[j] < s[j + 1])
то по убыванию отсортирует.
если исправить так, то сортировка будет только по убыванию. а мне нужно чтоб и по убыванию, и по возрастанию
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.09.2011, 20:07     Методы сортировки #4
Цитата Сообщение от Krol Посмотреть сообщение
если исправить так, то сортировка будет только по убыванию. а мне нужно чтоб и по убыванию, и по возрастанию
делай колбэк
Krol
0 / 0 / 0
Регистрация: 07.02.2010
Сообщений: 49
19.09.2011, 20:32  [ТС]     Методы сортировки #5
а подробнее можно? что у куда дописать
Konder
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 14
19.09.2011, 22:22     Методы сортировки #6
А можно более точно узнать задание? А то, что то оно как то расплывчато выглядит. Лично мне не понятно, зачем вообще выводить рандомный массив.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.09.2011, 22:34     Методы сортировки #7
Цитата Сообщение от Krol Посмотреть сообщение
а подробнее можно? что у куда дописать
Функция сортировка должна принимать указатель на функцию, которая будет производить сравнение элементов. Вместо if (a[i] < a[i + 1]) вызываешь функцию, общепринято возвращать -1, если первый элемент больше второго, 0 если равны и 1, если второй больше первого. Пишешь две функции, которые будут выполнять сравнение (одна для сортировки по возрастанию, вторая по убыванию) и передаешь их в функцию сортировки. За подробностями, изучай код функции qsort. Таким образом одна функция сортирует в обоих направленияих.
Krol
0 / 0 / 0
Регистрация: 07.02.2010
Сообщений: 49
19.09.2011, 22:59  [ТС]     Методы сортировки #8
если честно, но совсем ничего не понял...ты не мог бы, если не трудно, показать ту часть кода, который нужно изменить...а то, я что то совсем запутался...
Thinker
Эксперт C++
4220 / 2194 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.09.2011, 23:09     Методы сортировки #9
s[j] > s[j + 1]

Такой фрагмент меняете на вызов функции по адресу, который передается в качестве параметра. Почитайте об адресах функций.

Хотя, fasked, я где-то слышал, может неправда, но вроде как от работы с адресами функций хотят отказаться, нет? Вроде как это признак плохого тона.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.09.2011, 23:12     Методы сортировки #10
Thinker, если говорить о C++, то соглашусь. А в Си без них никуда
Thinker
Эксперт C++
4220 / 2194 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.09.2011, 23:15     Методы сортировки #11
Цитата Сообщение от fasked Посмотреть сообщение
Thinker, если говорить о C++, то соглашусь. А в Си без них никуда
В том то и дело, что относительно Си тоже такая тенденция. То есть адреса переменных - пожалуйста, а вот адреса функций - ни-ни. Хотя странно, надо все же уточнить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2011, 00:48     Методы сортировки
Еще ссылки по теме:

C++ Основные методы сортировки массивов
Простые методы сортировки C++
Методы внешней сортировки C++
C++ Методы сортировки одномерного массива
C++ Разные методы сортировки

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

Или воспользуйтесь поиском по форуму:
fasked
20.09.2011, 00:48     Методы сортировки
  #12

Не по теме:

Thinker, слово "тенденция" относительно Си звучит даже забавно

Yandex
Объявления
20.09.2011, 00:48     Методы сортировки
Ответ Создать тему
Опции темы

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