Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Сдвинуть массив на k позиций влево
- void ShiftLeftForK(double *a, unsigned int n, unsigned int k)
- {
- unsigned int i, j;
- unsigned int start_index;
- unsigned int counter = 0;// Счетчик перестановок
- double buffer;
- k = k%n;
- start_index = 0;// Начнем алгоритм с нулевого элемента
- while(counter<n)// Пока переставлены не все элементы
- {
- buffer = a[start_index];
- for(i = start_index, j = (i + k)%n; j!=start_index; i = j, j = (i + k)%n)
- /* Ищем элемент, который должен перейти на позицию i.
- * Это элемент с индексом j = (i + k)%n.
- * На следующей итерации: i = j, снова j = (i + k)%n.
- * Делаем так, пока j не станет равным индексу, с которого начали.
- */
- {
- a[i] = a[j];// Ставим элемент с индексом j на позицию i
- counter++;// Перестановка сделана
- }
- /* j - индекс, с которого начали.
- * Тогда i - индекс элемента, в который должен перейти элемент с начальным индексом.
- * Элемент с начальным индексом сохранен в буфере.
- */
- a[i] = buffer;
- counter++;// Перестановка сделана
- /* Если еще не все элементы переставлены, то на следующем витке while
- * начальным элементом будет элемент с индексом на 1 больше текущего начального.
- */
- /* Если не все элементы переставлены, то элемент с индексом на 1 больше текущего начального не переставлялся.
- * Доказательство:
- * Предположим противное.
- * Пусть виток цикла с начальным индексом previous_index переставлял элемент с индексом start_index + 1.
- * previous_index<=start_index
- * Возможны 2 случая:
- * 1) previous_index<start_index
- * Тогда виток цикла с начальным индексом previous_index + 1 уже переставлял элемент с индексом start_index + 2
- * И так далее любой элемент с начальным индексом из отрезка [0,k - 1] уже был переставлен.
- * Тогда любой элемент из отрезка [0,n - 1] уже был переставлен.
- * Противоречие.
- * 2) previous_index==start_index
- * Тогда каждый элемент, выбранный в качестве начального, переставляет следующий.
- * Тогда все элементы уже переставлены.
- * Противоречие.
- */
- start_index++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement