
19.10.2009, 15:21
|
|
Новичок
Регистрация: 14.03.2009
Сообщений: 25
Провел на форуме: 72034
Репутация:
5
|
|
Циклический сдвиг элементов массива вправо на k позиций
Сообщение от c0n Difesa
Будет еще замечательней, если другие также будут выкладывать свои алгоритмы (не только базовые, коих хватает в Википедии) с их обзорами. 
Ну чтож, попробую, мб кому-нибудь пригодится=)
Циклический сдвиг элементов массива вправо на k позиций
1) Код:
Код:
template <typename MassiveType>
void Shift(MassiveType *Massive, int MassiveLen, int k)
{
Reverse(Massive,0,MassiveLen-1); //разворачиваем массив
Reverse(Massive,0,k-1); //разворачиваем первые к элементов
Reverse(Massive,k,MassiveLen-1); //разворачиваем последние n-k эллементов
}
template <typename MassiveType>
void Reverse(MassiveType *Massive, int StartElem, int FinishElem)
{
int i;
MassiveType tresh;
for (i=0;i<=(FinishElem-StartElem)/2;i++)
{
tresh=Massive[StartElem+i];
Massive[StartElem+i]=Massive[FinishElem-i];
Massive[FinishElem-i]=tresh;
}
}
2) Особенности:
Не используется выделение больших объемов дополнительной памяти.
3) Временная сложность:
Во всех случаях Т(n) = О(N)
Последний раз редактировалось Nikituki; 19.10.2009 в 15:33..
|
|
|