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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2016, 16:27   #1
alina44
Новичок
Джуниор
 
Регистрация: 06.01.2016
Сообщений: 5
По умолчанию использавание рекурсии вместо цикла

Помогите, пожалуйста!
Нужно использовать рекурсию вместо цикла:

Код:
#include <iostream>
using namespace std;
int a[100], b[100], n;
 
int digit(int n, int p)
{
    return (n >> p & 1);
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int k = sizeof(int);
    for(int i = 0; i < k; i++)
    {
        int c[2] = {0};
        for(int j = 0; j < n; j++)
            c[digit(a[j],i)]++;
        for(int j = 1; j < 2; j++)
            c[j] += c[j - 1];
        for(int j = n - 1; j > -1;j--)
            b[--c[digit(a[j],i)]] = a[j];
        for(int j = 0; j < n; j++)
            a[j] = b[j];
    }
    for(int i = 0; i < n; i++)
        cout << a[i] <<endl;
    return 0;
}

Пыталась переделать, но что-то пошло не так...



Код:
#include <iostream>
 
void out(int n, int t, int* &arr){
    std::cout << "Enter " << n + 1 << " element: " << std::endl;
    std::cin >> arr[n];
    if (n < t - 1) out(++n, t, arr);
}
 
void out_sort(int n, int t, int* arr){
    std::cout << "arr[" << n + 1 << "]=" << arr[n] << std::endl;
    if (n < t - 1) out_sort(++n, t, arr);
}
 
void sort1(int countofbits, int n, int t, int* arr, int &count0){
    if (arr[n] >> countofbits & 1 == 0)
        count0++;
    if (n < t - 1) sort1(countofbits, ++n, t, arr, count0);
}
 
void sort2(int i, int t, int* arr, int* &mirrow, int countofbits, int &count0, int &count1){
    mirrow[--((arr[i] >> countofbits & 1 == 0) ? (count0) : (count1))] = arr[i];
    if (i > 0) sort2(--i, t, arr, mirrow, countofbits, count0, count1);
}
 
void sort3(int i, int t, int* &arr, int* mirrow){
    arr[i] = mirrow[i];
    if (i < t - 1) sort3(++i, t, arr, mirrow);
}
 
void sort(int countofbits, int t, int* &arr){
    int count0, count1;
    count0 = 0;
    count1 = t;
    sort1(countofbits, 0, t, arr, count0);
    int* mirrow = (int*)malloc(t*sizeof(int));
    sort2(t, t, arr, mirrow, countofbits, count0, count1);
    sort3(0, t, arr, mirrow);
    if (countofbits < 8 * sizeof(int)) sort(++countofbits, t, arr);
}
 
int main() {
    int t;
    std::cout << "Enter n: " << std::endl;
    std::cin >> t;
    int* arr = (int*)malloc(t*sizeof(int));
    out(0, t, arr);
    sort(0, t, arr);
    out_sort(0, t, arr);
    system("pause");
    return 0;
}

Последний раз редактировалось Аватар; 06.01.2016 в 16:39.
alina44 вне форума Ответить с цитированием
Старый 06.01.2016, 16:44   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А как задание звучит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2016, 16:47   #3
alina44
Новичок
Джуниор
 
Регистрация: 06.01.2016
Сообщений: 5
По умолчанию

реализовать битовую сортировку без использования циклов
alina44 вне форума Ответить с цитированием
Старый 06.01.2016, 18:49   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Э-э-эм... Я немного от темы отойду: Ты свой код запускала? Он у тебя вообще нормально сортирует?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2016, 19:02   #5
alina44
Новичок
Джуниор
 
Регистрация: 06.01.2016
Сообщений: 5
По умолчанию

выводит число -33686019
alina44 вне форума Ответить с цитированием
Старый 06.01.2016, 19:28   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не, я имел ввиду твой первый код с циклами.
Я его запустил, но не увидел чтоб выходной поток сортировался.
Или же я не понимаю алгоритма такой сортировки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2016, 19:45   #7
alina44
Новичок
Джуниор
 
Регистрация: 06.01.2016
Сообщений: 5
По умолчанию

1-й работает и сортирует

n >> p & 1
Мы сдвигаем число вправо что бы нужный нам бит стал первым, а потом получаем его с помощью логического "и" с 1
for(int j = 0; j < n; j++)
c[digit(a[j],i)]++; // подситываем количсетво каждой из цифр
for(int j = 1; j < 2; j++)
c[j] += c[j - 1]; // устанавливаем позиции, на которых должны располагаться числа с заданными цифрами
for(int j = n - 1; j > -1;j--)
b[--c[digit(a[j],i)]] = a[j]; // расставляем в соответствии с цифрой
for(int j = 0; j < n; j++)
a[j] = b[j];
alina44 вне форума Ответить с цитированием
Старый 06.01.2016, 21:45   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

От я опоссум )))
Старею видать, мозги совсем не варят...
Вот, смотри. Рекурсия такая подойдет?:
Код:
// Битовая сортировка.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

const int n=10;
int a[n]={1,5,2,3,7,8,9,2,4,43}, b[n];
int c[2] = {0};
 
int digit(int n, int p)
{
    return (n >> p & 1);
}

void for1(int i,int j, int n){
 if(j==n) return;
 c[digit(a[j],i)]++;
 for1(i,j+1,n);
}

void for2(int i,int j){
 if(j==-1) return;
 b[--c[digit(a[j],i)]] = a[j];
 for2(i,j-1);
}

void for3(int i,int j){
 if(j==-1) return;
 b[--c[digit(a[j],i)]] = a[j];
 for2(i,j-1);
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	int i=0;

    int k = sizeof(int);
    for(int i = 0; i < k; i++)
    {
		memset(&c[0],0,sizeof(c));
		for1(i,0,n);
		c[1]+=c[0];
		for2(i,n-1);
		memcpy(&a[0],&b[0],sizeof(int)*n);
    }

    for(int i = 0; i < n; i++)
        cout<<a[i]<<'\t';
	system("pause");
    return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2016, 22:22   #9
alina44
Новичок
Джуниор
 
Регистрация: 06.01.2016
Сообщений: 5
По умолчанию

Да, спасибо большое
alina44 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вместо русского текста символы - после переустановки Windows в файлах мусор вместо русских букв. МАРИННН Windows 14 13.10.2013 08:53
алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе. Necare Помощь студентам 0 15.11.2011 18:26
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
С помощью рекурсии без операторов цикла и перехода написать процедуру P(N) WhyBeNormal Помощь студентам 1 29.01.2009 01:20
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10