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

Сортировка выбором. Рекурсия - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.70
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.08.2010, 02:47     Сортировка выбором. Рекурсия #1
Дичайше туплю... Нужна сортировка выборкой одномерного массива. Рекурсией. Итерацией могу сделать. Рекурсией - никак... Застопорило что-то. Буду благодарен за подсказку и помощь.

Добавлено через 6 минут
Вот обычная сортировка выбором с помощью итераций...

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
#include <iostream>
#include <ctime>
 
void selectionSort(int Arr[], int size); 
 
int main()
{
    srand(time(NULL));
    const int Size=10;
    int Arr[Size];
    for(int i=0;i<Size;++i)
        Arr[i]=1+rand()%100-1+1;
    std::cout<<"Arr is:\n";
    for(int i=0;i<Size;++i)
    {
        std::cout<<Arr[i]<<' ';
    }
    std::cout<<std::endl;
    selectionSort(Arr, Size);
    return 0;
}
 
void selectionSort(int Arr[], int size)
{
    int k=0, x=0;
    for(int i=0; i < size; i++) 
    { 
        k=i; x=Arr[i];
        for(int j=i+1; j < size; j++) 
        if (Arr[j] < x) 
        {
            k=j; x=Arr[j]; 
        }
        Arr[k] = Arr[i]; 
        Arr[i] = x;
    }
    std::cout<<"Sorted array:\n";
    for(int i=0;i<size;++i)
        std::cout<< Arr[i] <<' ';
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2010, 02:47     Сортировка выбором. Рекурсия
Посмотрите здесь:

C++ Сортировка выбором на с++
C++ /сортировка выбором C++
сортировка выбором C++
C++ Сортировка выбором
C++ сортировка выбором
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.08.2010, 03:22     Сортировка выбором. Рекурсия #2
ну вот какую-то рекурсию присобачил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void sort(int * a, int n)
{
   int t = 0;
   for(int i = 0; i < n; ++i)
   {
      if(a[i] < a[t])
         t = i;
   }
 
   std::swap(a[t], a[0]);
 
   if(n > 1)
      sort(a + 1, n - 1);   
      
   return;
}
Добавлено через 7 минут
Цитата Сообщение от Lavroff Посмотреть сообщение
Итерацией могу сделать. Рекурсией - никак
вообще рекурсия в принципе просто из итераций делается. просто берешь и цикл заменяешь условием, если условие выполняется, то вызываешь следующую рекурсию, если нет - возвращаешься из функции. смысл то тот же.
если хочешь можно тебе задачек еще на рекурсию напридумывать
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.08.2010, 03:23  [ТС]     Сортировка выбором. Рекурсия #3
fasked, Спасибо. Работает...
А про задачки... Я только за.

Не по теме:

Что-то со мной случилось в последнее время. Ничего сделать не могу. Даже элементарного... Не знаешь в чем может быть дело?

fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.08.2010, 03:30     Сортировка выбором. Рекурсия #4
Цитата Сообщение от Lavroff Посмотреть сообщение
Что-то со мной случилось в последнее время. Ничего сделать не могу. Даже элементарного...
ну тогда давай начнем с самого элементарного
найти сумму элементов массива рекурсивно.
да, и в нагрузку. пиши сразу тест к своей программе. например есть же в STL алгоритм, который тоже находит сумму элементов массива. вот ты и сравнивай результаты своей функции и STL'вского алгоритма. В результате на экране должна быть информация вида "true/false".
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.08.2010, 03:53  [ТС]     Сортировка выбором. Рекурсия #5
Больше всего времени ушло на поиск того как включить accumulate...

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
#include <iostream>
#include <ctime>
#include <numeric>
 
int Sum_of_el(int Arr[], int size);
 
int main()
{
    srand(time(NULL));
    const int Size=10;
    int Arr[Size];
    for(int i=0;i<Size;++i)
        Arr[i]=1+rand()%10-1+1;
    for(int i=0;i<Size;++i)
        std::cout<< Arr[i] <<' ';
    std::cout<<std::endl;
    int Sum=0;
    int AlgSum=0;
    Sum=Sum_of_el(Arr, Size);
    std::cout<< Sum <<'\n';
    AlgSum=std::accumulate(Arr, Arr+Size, AlgSum);
    std::cout<< AlgSum <<'\n';
    if(Sum==AlgSum)
        std::cout<<std::boolalpha<<true<<'\n';
    else
        std::cout<<std::boolalpha<<false<<'\n';
        return 0;
}
 
int Sum_of_el(int Arr[], int size)
{
    static int Sum=0;
    int i=size-1;
    if(i<0)
        return Sum;
    Sum+=Arr[i];
    return Sum_of_el(Arr, size-1);
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.08.2010, 03:58     Сортировка выбором. Рекурсия #6
Цитата Сообщение от Lavroff Посмотреть сообщение
Больше всего времени ушло на поиск того как включить accumulate...
тоже полезно, а вот статическими переменными пользоваться нечестно!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.08.2010, 04:00  [ТС]     Сортировка выбором. Рекурсия #7
Окей. Резалт аналогичный

C++
1
2
3
4
5
6
7
8
9
int Sum_of_el(int Arr[], int size)
{
    int Sum=0;
    int i=size-1;
    if(i<0)
        return Sum;
    Sum+=Arr[i];
    return Sum+Sum_of_el(Arr, size-1);
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.08.2010, 04:04     Сортировка выбором. Рекурсия #8
Цитата Сообщение от Lavroff Посмотреть сообщение
Окей. Резалт аналогичный
return все же эстетичнее будет в конец вставлять. хотя это мои личные предпочтения, просто люблю, чтобы выход был в конце текста функции, а не посередь.

так. я спать пожалуй спать пойду, а чтобы ты не скучал пока. вот. рекурсивно реализовать функцию аккермана
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.08.2010, 04:21  [ТС]     Сортировка выбором. Рекурсия #9
Короче и красивше.

C++
1
2
3
4
5
6
7
8
9
int Sum_of_el(int Arr[], int size)
{
    int Sum=0;
    Sum+=*Arr;
    if(size==1)
        return Sum;
    else
        return Sum+Sum_of_el(Arr+1, size-1);
}
Добавлено через 12 минут
Аккер:

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
#include <iostream>
 
typedef unsigned long long U_LL;
 
U_LL Akker(U_LL n, U_LL m);
 
int main()
{
    U_LL n, m;
    std::cout<<"Enter first numb: ";
    std::cin>>m;
    std::cout<<"Enter second numb: ";
    std::cin>>n;
    std::cout <<Akker(m, n);
    return 0;
}
 
U_LL Akker(U_LL m, U_LL n)
{
    if(m==0)
        return n+1;
    else if(m>0&&n==0)
        return Akker(m-1, 1);
    else if(m>0&&n>0)
        return Akker(m-1, Akker(m, n-1));
}
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
08.08.2010, 04:35     Сортировка выбором. Рекурсия #10
Позволю себе вякнуть, что рекурсия тут нафик не нужна, ибо во-первых будет медленее работать, а во-вторых всегда есть возможность словить stack overflow.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.08.2010, 04:35  [ТС]     Сортировка выбором. Рекурсия #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
#include <iostream>
 
typedef unsigned long long U_LL;
 
U_LL Akker(U_LL n, U_LL m);
 
int main()
{
    U_LL n, m;
    std::cout<<"Enter first numb: ";
    std::cin>>m;
    std::cout<<"Enter second numb: ";
    std::cin>>n;
    std::cout <<Akker(m, n);
    return 0;
}
 
U_LL Akker(U_LL m, U_LL n)
{
    if(m==0)
        return n+1;
    else if(n==0)
        return Akker(m-1, 1);
    return Akker(m-1, Akker(m, n-1));
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.08.2010, 04:37     Сортировка выбором. Рекурсия #12
следующая. вычислить определитель квадратной матрицы рекурсивно.

Добавлено через 1 минуту
Цитата Сообщение от NightmareZ Посмотреть сообщение
Позволю себе вякнуть, что рекурсия тут нафик не нужна, ибо во-первых будет медленее работать, а во-вторых всегда есть возможность словить stack overflow.
можете, но задачи решаются специально рекурсивными методами
ForEveR
08.08.2010, 04:38  [ТС]
  #13

Не по теме:

fasked, Ты убийца) Чувствую с этим я просижу дольше

NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
08.08.2010, 04:39     Сортировка выбором. Рекурсия #14
Цитата Сообщение от fasked Посмотреть сообщение
можете, но задачи решаются специально рекурсивными методами
Всмысле специально?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
08.08.2010, 04:43     Сортировка выбором. Рекурсия #15
Цитата Сообщение от Lavroff Посмотреть сообщение
Короче и красивше.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int sum(int * arr, int cnt){
    return ( cnt == 1 ) ? *arr : *arr + sum(arr + 1, cnt - 1);
}
 
int main(void){
    int arr[] = { 1, 2, 3, 4, 5 };
    
    printf("1 + 2 + 3 + 4 + 5 = %d\n", sum(arr, sizeof(arr) / sizeof(*arr)));
 
    return 0;
}
ForEveR
08.08.2010, 05:52  [ТС]
  #16

Не по теме:

fasked, Про определитель. Это уже завтра... Если вообще смогу. Вспомнилась алгебра и моя не слишком большая любовь к определителям.

nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.08.2010, 09:35     Сортировка выбором. Рекурсия #17
Не короче, не красивше, но зато моё!!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int sum(int arr[], int size)
{
    if(size==0) return arr[0];
    else {return (arr[size]+sum(arr, size-1)); size--;};
}
int main()
{
    int a[10];
    for(int i=0;i<10;i++)
        cin>>a[i];
    cout<<sum(a,9)<<"\n";
    system("pause");
}
Добавлено через 6 минут
Вот, "подкрасил".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int sum(int arr[], int size)
{
    if(size==0)  return arr[0];
    else return arr[size]+sum(arr, --size);
}
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10}
    std::cout<<sum(a,9)<<"\n";
    system("pause");
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.08.2010, 01:36  [ТС]     Сортировка выбором. Рекурсия #18
Определитель. Для 3 правильно считает. Дальше не проверял. 20 тужился тужился не посчитал. Или просто я не дождался.
Совсем сам сделать не смог. Пришлось посмотреть на другие программы, понять модель и сделать вот так.

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
#include <iostream>
#include <cmath>
#include <ctime>
 
double determ(int** Arr, int size);
 
int main()
{
    srand(time(NULL));
    int size=3;
    int**Arr;
    Arr=new int*[size];
    for(int i=0;i<size;++i)
        Arr[i]=new int[size];
    for(int i=0;i<size;++i)
        for(int j=0;j<size;++j)
            Arr[i][j]=0+rand()%5-1+1;
    for(int i=0;i<size;++i)
    {
        for(int j=0;j<size;++j)
            std::cout<<Arr[i][j]<<' ';
        std::cout<<std::endl;
    }
    std::cout<< determ(Arr, size) <<'\n';
    for(int i=0;i<size;++i)
        delete[] Arr[i];
    delete[] Arr;
    return 0;
}
 
double determ(int** Arr, int size)
{
    int i,j;
    double det=0;
    int** matr;
    if(size==1)
    {
        det=Arr[0][0];
    }
    else if(size==2)
    {
        det=Arr[0][0]*Arr[1][1]-Arr[0][1]*Arr[1][0];
    }
    else
    {
        matr=new int*[size-1];
        for(i=0;i<size;++i)
        {
            for(j=0;j<size-1;++j)
            {
                if(j<i) 
                    matr[j]=Arr[j];
                else
                    matr[j]=Arr[j+1];
            }
            det+=pow((double)-1, (i+j))*determ(matr, size-1)*Arr[i][size-1];
        }
        delete[] matr;
    }
    return det;
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.08.2010, 01:38     Сортировка выбором. Рекурсия #19
Цитата Сообщение от Lavroff Посмотреть сообщение
Определитель. Для 3 правильно считает. Дальше не проверял. 20 тужился тужился не посчитал. Или просто я не дождался.
Совсем сам сделать не смог. Пришлось посмотреть на другие программы, понять модель и сделать вот так.
Проверять не буду, но на первый взгляд правильная. Точки останова вижу в 1 и в 2. Новая матрица создается. Зачтено
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2010, 01:42     Сортировка выбором. Рекурсия
Еще ссылки по теме:

C++ Сортировка выбором
C++ Сортировка выбором
C++ Сортировка выбором

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.08.2010, 01:42  [ТС]     Сортировка выбором. Рекурсия #20
fasked, Продолжение будет?) Только желательно без вышки) Скоро итак учеба уже)
Yandex
Объявления
09.08.2010, 01:42     Сортировка выбором. Рекурсия
Ответ Создать тему
Опции темы

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