Ваш подход становится менее эффективным; рассмотрим следующий вариант вашего алгоритма:
for(int j=i-1; j>=0; j--)
{
if(A[j] > value)
{
A[j+1] = A[j];
}
else
{
A[j+1] = value; // worst that could happen: self asignment;
// still less costly than another `if`!
break; // you're in the sorted part of the array, so all other
// values are smaller or equal as well -> can exit!
}
}
Теперь вам больше не нужен флажок / отверстие, но, что более важно, вам больше не нужно перебирать уже отсортированную меньшую часть.
То же самое, что вы достигли бы с двойным условием в цикле while, с которого вы начали ...
На самом деле, есть ошибка, если текущий элемент меньше всех уже отсортированных, предложение else
никогда не вводится, поэтому элемент не будет вставлен в первую позицию. Исправить это легко, хотя:
int j;
for(j = i-1; j >= 0; j--)
{
if(A[j] > value)
{
A[j+1] = A[j];
}
else
{
break;
}
}
A[j+1] = value; // (still self-assignment possible)
// if j got -1: insert at 0, so fine
Теперь мы стали еще ближе к оригинальному циклу while ...
Тем не менее, вы пытаетесь оптимизировать алгоритм, который хорошо известен своей неэффективностью (среднее (!) Время выполнения O(n²)
), я не считаю, что стоит так сильно заботиться о таком, лучше переключиться на быстрая сортировка с самого начала (O(n log(n))
среднее время выполнения), сортировка кучи (с максимальным O(n log(n))
временем выполнения, но худшими константами, чем быстрая сортировка) или intro-sort (гибрид первых двух, стандартный алгоритм сортировки C ++ std::sort
в большинстве реализаций).