这种快速排序算法有什么问题?

时间:2019-07-15 23:39:57

标签: c++ quicksort

我已经编写了这种快速排序算法,但是由于某种原因它不能正常工作,我需要一些帮助来找出错误。

我尝试不使用内置交换功能,但无法正常工作。

FindPivot函数在交换它们后返回数组的三个元素(开始,一半,结束)的中值,以便最小的元素在开始处,最大的在中间,中值在数组的末尾

#include <bits/stdc++.h>

using namespace std;

int pivotIdx, pivot, n;

int partitn(int* arr, int first, int last)
{
    pivot = FindPivot(arr,first,last-1);
//    pivot = arr[last-1];
    cout << "Pivot: " << pivot << endl;
    int L = first;
    int R = last-2;

    while(L<R)
    {
        while(arr[L]<=pivot)
            L++;
        while(arr[R]>=pivot)
            R--;
        swap(arr[L++],arr[R--]);
    }
    swap(arr[L],arr[last-1]);
    return L;
}

void QuickSort(int* arr,int first,int last)
{
    if(last-first < 6){
        InsertionSort(arr,first,last);
    }else{
        pivotIdx = partitn(arr, first, last);
        QuickSort(arr, first, pivotIdx);
        QuickSort(arr, pivotIdx+1, last);
    }
}

int main()
{
    cin >> n;
    int arr[100];
    for(int i=0;i<n;i++)
        cin>>arr[i];
    QuickSort(arr,0,n);
    for(int i=0;i<n;i++){
        cout << arr[i] << " ";
    }
    return 0;
}

输入:

  

8

     

5 1 6 2 7 3 8 4

输出:

  

数据透视:4

     

1 2 3 5 4 6 7 8

2 个答案:

答案 0 :(得分:1)

可能还有其他问题,但是当前的分区代码可能会扫描超过子数组的边界。假设枢轴不在子数组的任何一端,则代码可以用<代替<=和>代替> =,并且扫描不会超出边界。

        while(arr[L]<pivot)    // not <=
            L++;
        while(arr[R]>pivot)    // not >=
            R--;

答案 1 :(得分:-1)

输入:

5 1 6 2 7 3 8 4

它变成:

QuickSort([5 1 6 2 7 3 8 4], 0, 8)
partitn([5 1 6 2 7 3 8 4], 0, 8)

   pivot = 4
   L = 0 R = 6       [5 1 6 2 7 3 8 4]

   // Enter Loop
   L = 0 R = 5 swap  [3 1 6 2 7 5 8 4]
   L = 2 R = 3 swap  [3 1 2 6 7 5 8 4]
   L = 3 R = 2 swap  [3 1 6 2 7 5 8 4]
   // Exit Loop
   L = 3       swap  [3 1 6 4 7 5 8 2]    This looks wrong.
                                          The 2 and 6 are in the wrong place.