Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

помогите-сортировка массива

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Настя
Гость





СообщениеДобавлено: Вс Дек 12 2004 00:06    Заголовок сообщения: помогите-сортировка массива Ответить с цитатой

не могли бы вы мне помочь написать функции сортировки целочисленного массива размером n:
центрированной вставкой;
двоичной вставкой.
?
заранее большое спасибо.

центрированная вставка:
представим рабочий массив состоящим из 2х ветвей-нисходящей(левой) и восходящй(правой). Центральный элемент этого массива - медиана.
в позицию, расположенную в середине рабочего массива, помещается первый элемент(он и будет медианой). Нисходящая и восходящая ветви имеют указатели, кот. показываеют на ближайшие к началу и концу занятые позиции. После загрузки первого элемента в центральную позицию оба указателя совпадают и показывают на него. Следующий элемент исходного массива сравнивается с медианой. Если новый элемент меньше, то он размещается на нисходящей ветви, в противном случае - на ворсходящей ветви. Кроме того соответствующий концевой ук-ль продвигается на единицу вниз(нисходящая ветвь) или единицу вверх(восходящая ветвь).
Каждый последующий элемент исходного массива сравнив-ся вначале с медианой, а затем с элементами на соответствующей ветви до тех пор, пока не займет нужную позицию. Если область памяти, выделенная для одной ветви, будет исчерпана, то все элементы рабочего массива сдвигаются в противоположном направлении. Величина сдвига может варьироваться.

двоичная вставка:
использует для отыскания места вставки алгоритм двоичного поиска, т.е. при вставке j-го элемента, он сравнивается вначале с элементом [j/2], затем, если он меньше, сравниваеться с элементом [j/4], а если больше - с [j/2]+[j/4] и.т.д. до тех пор, пока он не найдет свое место.
Все элементы рабочего массива, начиная с позиции вставки и ниже, сдвигаются на одну позицию вниз, освобождая место для j-го элемента.
Вернуться к началу
ValeraGhost
Гость





СообщениеДобавлено: Вс Янв 02 2005 21:51    Заголовок сообщения: моя версия Ответить с цитатой

void sortCEN(int *array,int n)
{
int i,j,*arab,med,left,right,k=0,l=0;
arab=(int*)calloc(n,sizeof(int));
(n%2==0)?med=n/2:med=n/2+1;
arab[med]=array[0];
right=left=med;
k=0;
l=0;
for(i=1;i<n;i++)
{

if(array[i]<arab[med])
{
left--;
j=med;
while(array[i]<=arab[j]&&j>=left)
{
j--;
// if(j==1) {arab[0]=array[i];break;}
}
if(array[i]>arab[j])
{
for(k=0;k<j;k++)
{
arab[k]=arab[k+1];
}
}
arab[j]=array[i];

//printf("j %d arab[j] %d \n",j,arab[j]);

}

if(array[i]>=arab[med])
{
right++;
j=med;
while(array[i]>=arab[j]&&j<right)
{
j++;
//if(j==n-2) { arrab[n-1]=array[i]; break;}
}
if(array[i]<arab[j])
{
for(l=right;l>j;l--)
{
arab[l]=arab[l-1];
}
}
arab[j]=array[i];

//printf("j %d arab[j] == %d\n",j,arab[j]);

}

if(left==0)
{
int temp,perem;
for(perem=right;perem>0;perem--)
{
arab[perem]=arab[perem-1];
}
left=left+1;
right=right+1;

}
if(right==n)
{
int temp,perem;
for(perem=0;perem<right;perem++)
{
arab[perem]=arab[perem+1];
}
left=left-1;
right=right-1;
}


}

for(i=0;i<n;i++)
{
printf("%3d ",arab[i]);
}


}
Вернуться к началу
бинарная
Гость





СообщениеДобавлено: Вс Янв 02 2005 22:58    Заголовок сообщения: Ответить с цитатой

void Binsort(int *PtrMass, int count)
{
int i, j, pos, a, b, middle, num;

for (i=1; i < count; i++)
{
a=0; /* Hижняя граница поиска = 1-му эл-ту */
b=i; /* Верхняя = со 2 по count */
EXCHANGES++;
num=PtrMass[i]; /* Число для кот. нужно найти место */

while ( a!=b ) /* ...пока границы не слились... */
{
middle=(a+b)/2; /* Целая часть ср.арифм. суммы границ */

if (num > PtrMass[middle]) /* ..если число >числа стоящ.под */
{ /* номером middle то: */
a=middle+1; /* ниж. гран. = центру+1 */
} /* */
else /* или */
{ /* */
b = middle; /* верхняя граница = центру... */
}
CONDITIONS++;
ITERATION++;
}
pos=a; /* Содержит найденную позицию на кот. */
/* нужно поставить число */

for (j=i; j > pos; j--)
{ /* Подвигаем (на 1 вправо) эл-ты */
PtrMass[j]=PtrMass[j-1]; /* массива лежащие перед элементом, */
EXCHANGES++;
ITERATION++; /* для которого ищется место осво-
*/
} /* бождая 1 место */

PtrMass[pos]=num; /* Устанавливаем элемент на место */
}
}
Вернуться к началу
ValeraGhost
Гость





СообщениеДобавлено: Вс Янв 02 2005 22:59    Заголовок сообщения: void Binsort(int *PtrMass, int count) Ответить с цитатой

void Binsort(int *PtrMass, int count)
{
int i, j, pos, a, b, middle, num;

for (i=1; i < count; i++)
{
a=0; /* Hижняя граница поиска = 1-му эл-ту */
b=i; /* Верхняя = со 2 по count */
EXCHANGES++;
num=PtrMass[i]; /* Число для кот. нужно найти место */

while ( a!=b ) /* ...пока границы не слились... */
{
middle=(a+b)/2; /* Целая часть ср.арифм. суммы границ */

if (num > PtrMass[middle]) /* ..если число >числа стоящ.под */
{ /* номером middle то: */
a=middle+1; /* ниж. гран. = центру+1 */
} /* */
else /* или */
{ /* */
b = middle; /* верхняя граница = центру... */
}
CONDITIONS++;
ITERATION++;
}
pos=a; /* Содержит найденную позицию на кот. */
/* нужно поставить число */

for (j=i; j > pos; j--)
{ /* Подвигаем (на 1 вправо) эл-ты */
PtrMass[j]=PtrMass[j-1]; /* массива лежащие перед элементом, */
EXCHANGES++;
ITERATION++; /* для которого ищется место осво-
*/
} /* бождая 1 место */

PtrMass[pos]=num; /* Устанавливаем элемент на место */
}
}
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...