快速排序

直接上代码:

void InsertSort(int *array, int n)
{
    int tmp;
    int j;
    for (int p = 1; p < n; p++) {
        tmp = array[p];
        for (j = p; j > 0 && array[j - 1] > tmp; j--) {
            array[j] = array[j - 1];
        }
        array[j] = tmp;
    }
}

int Median3(int *array, int left, int right)
{
    int middle = (left + right) / 2;
    
    if (array[left] > array[middle])
        std::swap(array[left], array[middle]);
    if (array[left] > array[right])
        std::swap(array[left], array[right]);
    if (array[middle] > array[right])
        std::swap(array[middle], array[right]);
    
    std::swap(array[middle], array[right - 1]);
    return array[right - 1];
}

void Qsort(int *array, int left, int right)
{
    if (left + 3 <= right) {
        int pivot = Median3(array, left, right);
        int i = left;
        int j = right - 1;
        for (; ;) {
            while (array[++i] < pivot)
                ;
            while (array[--j] > pivot)
                ;
            if (i < j)
                std::swap(array[i], array[j]);
            else
                break;
        }
        std::swap(array[i], array[right - 1]);
        
        Qsort(array, left, i - 1);
        Qsort(array, i + 1, right);
    } else {
        InsertSort(array + left, right - left + 1);
    }
}

void QuickSort(int *array, int n)
{
    Qsort(array, 0, n - 1);
}

pivot元素的选择,值得研究。

posted @ 2017-11-11 17:09  Sawyer Ford  阅读(135)  评论(0编辑  收藏  举报