В главе 2 CLRS есть упражнение, в котором спрашивается, можно ли улучшить время выполнения сортировки вставками в наихудшем случае до O(n lg n)
. Я видел этот вопрос и нашел что это невозможно сделать.
Сложность в наихудшем случае не может быть улучшена, но будет ли реальное время работы при использовании 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
?
memmove()
для вашей реализации. На некоторых платформах это может быть более эффективно, но вы должны профилировать это, чтобы знать наверняка. Однако в целом сложность не изменится. - person WhozCraig   schedule 09.07.2013