Задача: Циклический сдвиг массива или строки - 3 уникальных алгоритма
Исходник: Последовательный обмен, язык: C# [code #64, hits: 14556]
автор: this [добавлен: 24.02.2006]
  1. public void CycleShift(ref String strarr, int rotdist)
  2. {
  3. int n = strarr.Length;
  4. for (int i = 0; i < this.GetCommonDivisor(n, rotdist); i++)
  5. {
  6. Char t = strarr[i];
  7. int j = i;
  8. while (true)
  9. {
  10. int k = j + rotdist;
  11. if (k >= n) k -= n;
  12. if (k == i) break;
  13.  
  14. //Делаем strarr[j] = strarr[k];
  15. this.ReplaceCharInString(ref strarr, j, strarr[k]);
  16. j = k;
  17. }
  18. //Делаем strarr[j] = t;
  19. this.ReplaceCharInString(ref strarr, j, t);
  20. }
  21. }
Циклический сдвиг массива символов strarr на rotdist позиций

Использует всего несколько дополнительных переменных.

По производительности уступает перестановке блоками и функции переворота

this.GetCommonDivisor() - метод нахождения наибольшего общего делителя
this.ReplaceCharInString() - метод замены символа в строке
Тестировалось на: MS Visual Studio 2005, .NET Framework 2.0

+добавить реализацию