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;
}
}
2番目のものを完全に実行することはできませんでしたが、それは私が考えていることの例です。
を使用することで目に見える速度の向上はありますmemmove
か?