Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 962
∙ повысить рейтинг >>
Micren
Статус: Бакалавр
Рейтинг: 524
∙ повысить рейтинг >>
Matrix
Статус: 5-й класс
Рейтинг: 318
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1367 от 04.08.2009, 21:05
Администратор рассылки: Dr_Andrew, Модератор
В рассылке: подписчиков - 637, экспертов - 157
В номере: вопросов - 1, ответов - 1
IRC-канал по теме: #C

Оценить выпуск >>
Нам очень важно Ваше мнение об этом выпуске рассылки!

Вопрос № 170932: Здравствуйте уважаемые программисты! Написал программу по сортировке массива методом Шелла. И вот с проблемой одной разобраться не могу. Все отлично сортируется кроме первого элемента! Как не ломал целый день голову не могу понять в чем дело. Независ...



Вопрос № 170932:

Здравствуйте уважаемые программисты! Написал программу по сортировке массива методом Шелла. И вот с проблемой одной разобраться не могу. Все отлично сортируется кроме первого элемента! Как не ломал целый день голову не могу понять в чем дело. Независимо от количества элементов и от вида массива первый элемент не сортируется и все тут! Знаю что возможно это слишком легко чтобы задавать вопрос на форум, но к сожалению мне больше не куда обратиться, а сам я не вижу ошибки. Если кто разбирается в сортировках прошу вашей помощи.
Сама сортировка происходит в функции "sort".

Отправлен: 30.07.2009, 20:40
Вопрос задал: Slayder, Посетитель
Всего ответов: 1
Страница вопроса >>


Отвечает Micren, Бакалавр :
Здравствуйте, Slayder.
Просто у Вас первый элемент никогда не берется в расчет while(k>0), а первый элемент имеет индекс 0.
Код:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100 //кол-во эл-в массива
void sort (long *x, long n); // прототип функции сортировки методом Шелла

int main ()
{
long x[N]; // обьявление массива x[N]
int i;
srand((unsigned int)time(0));
printf ("\n Vyvod massiva: \n");
for (i=0;i<N;i++)
{
x[i]=rand()%100; //массив заполняется случ. Числами (до 99)
printf("%5d",x[i]);
}
sort (x,N);
system("PAUSE");
}

void sort(long* x,long n )
{
int i,k,tmp,c,m;
c=0; m=0; / / Переменные для подсчета кол-ва сравнений и пересылок между элементами
int incr=n/2;
while (incr>0)
{
for (i=incr; i<n; i++)
{
k=i-incr;
while (k>=0)
{
c++;
if (x[k]>x[k+incr])
{
tmp=x[k]; x[k]=x[k+incr]; x[k+incr]=tmp;
m++; k=k-incr;
}
else k=-1;
}
}
incr=incr/2;
}

printf ("\n\n Sortirovka metodom Shella: \n");
for (i=0; i<n; i++)
printf("%5ld", x[i]);
printf ("\n\n Kolichestvo sravneniy = %d", c);
printf ("\n kolichestvo peresylok = %d", m);
}

Вы вроде бы пишете программу на C++, но выглядит она как 15 летней давности. Кроме того в алгоритме Шелла используют сортировку вставками.
Вот пример:
Код:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>

template<class _Ty,size_t _Dim>
void shellSort(_Ty (&array)[_Dim])
{
size_t inc=_Dim;
while(inc>>=1)
{
for(size_t i=inc;i<_Dim;++i)
{
_Ty tmp=array[i];
size_t j=i;
while(j>=inc && array[j-inc]>tmp)
{
array[j]=array[j-inc];
j-=inc;
}
array[j]=tmp;
}
}
}

template<class _Ty,size_t _Dim>
void printArray(std::string msg,_Ty (&array)[_Dim])
{
std::cout<<msg<<std::endl;
for(size_t i=0;i<_Dim;++i)
{
std::cout<<array[i]<<' ';
}
std::cout<<std::endl;
}

const size_t N=100;

int main ()
{
setlocale(LC_ALL,"russian_russia");
srand(static_cast<unsigned int>(time(0)));

l ong x[N];
for (size_t i=0;i<N;++i)
{
x[i]=rand()%100;
}

printArray("Исходный массив:",x);
shellSort(x);
printArray("Отсортированный массив:",x);

system("PAUSE");
}


Совет:
Стандарт C++ не поддерживает объявление функции без типа возврата(как это есть в C) напр:
Код:

main(){}

Хотя некоторые компиляторы и игнорируют этот факт, выдавая всего лишь предупреждение, лучше следовать стандарту.

Впрочем возможно Вы программируете на C. Тогда это к Вам не относится.

Ответ отправил: Micren, Бакалавр
Ответ отправлен: 30.07.2009, 21:02

Оценка ответа: 5
Комментарий к оценке:
Спасибо большое теперь понятно )

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 252783 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск >>
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.6 от 21.07.2009

    В избранное