1

ソート対象の配列の長さが短い場合に挿入ソートに切り替えるクイックソートを書いています。いくつかのテストを実行したところ、ソートされる配列が 200 要素以下の場合、挿入ソートに切り替える方が高速であることがわかりました。これは非常に大きいようです。私は 20 に近いものを期待していました。基本的なウィキペディアのアルゴリズムを使用しました。

void quicksort(int list[asize], int left, int right)
{
    int pivotindex;
    int newpivotindex;

    if (left < right)
    {
            if ((right-left)<=200)
            {
            insertionsort(list,left,right);
            }
    }
    else
    {
        pivotindex = r_rand(left,right);
        newpivotindex = partition(list, left, right, pivotindex);

        quicksort(list, left, newpivotindex-1);
        quicksort(list, newpivotindex+1, right); 
    }
    return;
}

int partition(int* list,int left, int right, int pivotindex)
{
int pivotvalue = list[pivotindex];
int temp;
int i;
int storeindex;

temp=list[pivotindex];
list[pivotindex]=list[right];
list[right]=temp;

storeindex=left;

for (i=left;i<right;i++)
{
    if (list[i] < pivotvalue)
    {
        temp=list[i];
        list[i]=list[storeindex];
        list[storeindex]=temp;

        storeindex++;
    }
}

temp=list[storeindex];
list[storeindex]=list[right];
list[right]=temp;

return storeindex;
}

void insertionsort(int* list, int left, int right)
{
int i;
int item;
int ihole;

for (i=left;i<=right;i++)
{
    item=list[i];
    ihole=i;
    while (ihole > 0 && list[ihole-1] > item)
    {
        list[ihole]=list[ihole-1];
        ihole--;
    }
    list[ihole]=item;
}

return;
}
4

0 に答える 0