На каждой итерации исходный код, который вы представляете, перемещает каждый элемент на место, перемещая элементы в цикле. Для цикла n -элемента, который включает в себя n + 1 назначения.
Можно реализовать сортировку вставкой, перемещая элементы с попарными перестановками вместо больших циклов. На самом деле этому иногда учат. Это возможно, потому что любая перестановка (не только циклы) может быть выражена как серия перестановок. Реализация цикла n -элементов с помощью свопов требует n -1 свопов, а каждый своп, представляющий собой цикл из 2 элементов, требует 2 + 1 = 3 назначения. Таким образом, для циклов, превышающих два элемента, подход, использующий парные свопы, делает больше работы, масштабируя его как 3 * ( n -1), а не n + 1. Это не меняет асимптотическую сложность, однако, как вы можете видеть по факту, что показатель n не изменяется.
Но обратите внимание на еще одно ключевое отличие между исходным кодом и вашим: исходный код сканирует назад по списку, чтобы найти позицию вставки, тогда как вы сканируете вперед . Независимо от того, используете ли вы парные свопы или больший цикл, сканирование в обратном направлении имеет то преимущество, что вы можете выполнять необходимое переупорядочение по ходу, так что как только вы найдете позицию вставки, все готово. Это одна из вещей, которая делает сортировку вставкой настолько хорошей среди сортировок сравнения, и почему она особенно быстра для входов, которые изначально почти отсортированы.
Сканирование вперед означает, что как только вы найдете позицию вставки, вы только начали. Вы затем должны циклически изменить элементы. В результате ваш подход проверяет каждый элемент заголовка отсортированного массива на каждой итерации. Кроме того, когда он фактически выполняет переупорядочение, он выполняет кучу ненужных сравнений. Вместо этого он мог бы использовать знание, что заголовок списка начал сортироваться, и просто выполнить цикл (в любом случае) без каких-либо дополнительных сравнений. Дополнительные сравнения маскируют тот факт, что код просто выполняет соответствующий цикл элемента в этот момент ( вы осознали это?), И, возможно, поэтому несколько человек приняли вашу реализацию за Bubble Sort.
Технически , вы по-прежнему являетесь сортировщиком вставки, но это реализация, которая не использует никаких преимуществ абстрактного алгоритма сортировки вставкой, что дает хорошо написанным реализациям преимущество над другими аналогами того же типа. асимптотическая сложность.