В главе 2 главы CLRS есть упражнение, в котором задается вопрос о том, будет ли улучшено время сортировки в наихудшем случае до O(n lg n)
. Я увидел this question и обнаружил, что это невозможно.memmove против копирования отдельных элементов массива
В худшем случае сложность не может быть улучшена, но с использованием memmove
реальное время работы лучше по сравнению с индивидуальным перемещением элементов массива?
Код для индивидуально движущихся элементов
void insertion_sort(int arr[], int length)
{
/*
Sorts into increasing order
For decreasing order change the comparison in for-loop
*/
for (int j = 1; j < length; j++)
{
int temp = arr[j];
int k;
for (k = j - 1; k >= 0 && arr[k] > temp; k--){
arr[k + 1] = arr[k];
}
arr[k + 1] = temp;
}
}
Код для перемещения элементов с помощьюmemmove
void insertion_sort(int arr[], int length)
{
for (int j = 1; j < length; j++)
{
int temp = arr[j];
int k;
for (k = j - 1; k >= 0 && arr[k] > temp; k--){
;
}
if (k != j - 1){
memmove(&arr[k + 2], &arr[k + 1], sizeof(int) *(j - k - 2));
}
arr[k + 1] = temp;
}
}
я не мог получить 2-ым, чтобы работать отлично, но это пример о том, что я думаю делать.
Будут ли видимые улучшения скорости с помощью memmove
?
Это зависит от качества вашей библиотеки C и качества сгенерированного кода. Вам придется попробовать и посмотреть. – zwol
Функция lib-вызова универсальной функции перемещения памяти будет нажата, чтобы выбить ваш простой цикл. Я предлагаю вам заглянуть в источник 'memmove()' для вашей реализации. На некоторых платформах это может быть более эффективным, но вы должны проконтролировать его, чтобы точно знать. В целом, однако, * сложность * не изменится. – WhozCraig