在 CLRS 第 2 章中有一个练习,询问是否将插入排序的最坏情况运行时间改进为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;
}
}
我无法让第二个完美运行,但这是我正在考虑做的一个例子。
使用 会有任何明显的速度改进memmove
吗?