Эта задача хоть и не полностью идентична, но похожа на задачу о траспонированиии матрицы, и к ней применимы те же методы оптимизации. Для улучшения доступа к памяти можно разбивать на блоки.
Посмотрите этот ответ на StackOverflow, особенно два метода в самом конце:
stackoverflow.com/a/16743203
Ещё можете глянуть вот эту статью в википедии:
In-place matrix transposition