1. 程式人生 > >快速排序的改進方法

快速排序的改進方法

可以在選擇中樞結點時,選擇left, right,(left+right)/2三個位置中關鍵字居中的元素。

注意需要將選好的中樞結點與左端元素交換位置,因為如果不交換位置,演算法就有問題了,這是由於right--在left++先執行,導致right最後退出迴圈時指向的值一定比中樞結點值小。例如選擇的是right作為中樞結點,最後一步會把更小的值交換到最後。

void quickSort(Element arr[], int left, int right)
{
    int mid;
    
    if(left < right)
    {
        mid = partition_im(arr, left, right);
        quickSort(arr, left, mid-1);
        quickSort(arr, mid+1, right);
    }
}

int partition_im(Element arr[], int left, int right)
{
    Element base;
    Element temp;
    int base_index, mid;
    
    mid = (left + right)/2;
    base_index= median(arr, left, mid, right);//選擇三者中的中間值
    base = arr[base_index];
    
    //將中軸元素與左端點元素交換位置
    if(base_index != left)
    {
        temp = arr[base_index];
        arr[base_index] = arr[left];
        arr[left] = temp;
        base_index = left;
    }
    
    while(left < right)
    {
        while(arr[right].key >= base.key && right > left)
            right--;
        while(arr[left].key <= base.key && left < right)
            left++;
        if(left < right)
        {
            temp = arr[right];
            arr[right] = arr[left];
            arr[left] = temp;
        }
    }

    arr[base_index] = arr[left];
    arr[left] = base;
        
    return left;
}