CLRS 2 장에서는 삽입 정렬의 최악의 실행 시간이 O(n lg n)
으로 개선되는지 여부를 묻는 연습이 있습니다. 나는 this question을보고 그것을 할 수 없다는 것을 알았습니다.memmove 대 개별 배열 요소 복사하기
최악의 경우의 복잡성을 개선 할 수는 없지만 memmove
을 사용하면 배열 요소를 개별적으로 이동하는 것보다 실제 실행 시간이 더 좋아 지나요? 개별적으로 움직이는 요소 내가 완벽하게 실행하기 위해 2 하나를 가져올 수 없습니다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;
}
}
를 사용하여 요소를 이동
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
을 사용하여 눈에 띄는 속도 향상이 있습니까?
이것은 C 라이브러리의 품질과 생성 된 코드의 품질에 따라 다릅니다. 당신은 그것을 시도하고보아야 할 것입니다. – zwol
보편적 인 메모리 이동 함수에 대한 lib-call은 간단한 루프를 없애기 위해 눌려 질 것입니다. 구현을 위해'memmove()'소스를 들여다 보는 것이 좋습니다. 일부 플랫폼은 더 효율적 일 수 있지만 확실히 알기 위해서는 프로파일 링해야합니다. 그러나 전반적으로 * 복잡성 *은 변하지 않습니다. – WhozCraig