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



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

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

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=0;
}
}
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);
}

Обсуждение

Неизвестный
30.07.2009, 21:02
общий
это ответ
Здравствуйте, 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)));

long 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. Тогда это к Вам не относится.
5
Спасибо большое теперь понятно )
Форма ответа