Смысл индексных переменных при работе с массивами
При работе с массивами используются переменные-индексы, через которые происходит извлечение элементов массива. В значительном проценте случаев этот процесс осуществляется последовательно, элемент за элементом. Тогда в программе обязательно будут присутствовать фрагменты
while() {... c=A[i]; i++; ...} // Извлечь очередной и продвинуть индекс
while() {... c=A[i++]; ...} // " Нежесткая" связь с циклом
for (...;...;i++) { ... c=A[i]; ... } // " Жесткая" связь с циклом
while() {... A[i]=c; i++; ...} // Записать очередной и продвинуть индекс
while() {... A[i++]=c; ...} // " Нежесткая" связь с циклом
for (...;...;i++)
{ ... c=A[i]; ... } // " Жесткая" связь с циклом
Заметим, что процесс последовательного движения по массиву может быть " жестко" связан с выполнением цикла, тогда за каждый шаг цикла происходит строго одно перемещение и i++ может находиться в заголовке. Если же такой связи нет, тогда " движение" по массиву может быть косвенно связанным с самим циклом, через какие-либо условия. При этом оно может протекать со своей " скоростью" .
В качестве примера рассмотрим процесс разделения массива на две части относительно значения некоторого элемента - медианы. Пусть требуется переписать элементы массива A в массив B так, чтобы в выходном массиве слева относительно выбранного A[k] , называемого медианой, находились все элементы, меньшие данного, а справа - большие. Это можно сделать, если заполнять массив B с двух концов, перенося поочередно элементы из исходного массива. Для реализации такой программы потребуется три индекса и один цикл, поскольку имеет место три независимых " движения" по массивам, причем одно из них связано с циклом просмотра :
-" движение" по массиву A слева направо, связанное с циклом просмотра массива ;
-" движение" по массиву B в процессе заполнения его с левого конца ;
-" движение" по массиву B в процессе заполнения его с правого конца.
int A[20],B[20];
int i; // Движение по массиву A
int k1; // Движение по массиву B слева направо
int k2; // Движение по массиву B справа налево
int m; // Индекс элемента - медианы в А
for (i=0,k1=0,k2=19; i< 20; i++) // Просмотр A жестко связан с циклом
{
if (i==m) continue; // Медиану - пропустить
if (A[i]<A[m])
B[k1++]=A[i]; // Добавить слева
else
B[k2--]=A[i]; // Добавить справа
} // Движение по B не связано жестко с циклом
B[k1]=A[m]; // Перенести медиану в точку " встречи" k1-k2