如何计算快速排序期间发生的阵列比较数?

时间:2015-04-23 15:37:36

标签: c++ algorithm sorting quicksort

我编写了一个C ++程序,用于使用Quicksort算法对数组进行排序。

该程序还计算排序期间发生的数组元素比较次数。

我确信快速排序算法逻辑有效,但我不确定正在打印的比较数是否合适......

如果有人能告诉我一种确定给定输入中可能发生的数组元素比较的机制,我将不胜感激。 任何带有比较计数的示例数组也将帮助我测试程序的正确性。

程序代码:

using namespace std;

//Partition Logic
int* partion(int *a,int l, int r,int counter){
    //Initialization of parameters
    int* p = new int[2];
    int p_index=l;
    int pivot = a[r];

    //Loop through the array and check if a[i] is less than pivot
    for(int i=l;i<r;i++){
        if(a[i]<=pivot){
            counter++;
            swap(a[i],a[p_index]);
            counter++;
            p_index++;
        }
    }
    swap(a[p_index],a[r]);
    counter++;
    p[0] = p_index;
    p[1] = counter;
    return p;
}

//Recurse algorithm for QuickSort
int QuickSort(int *a,int l,int r,int counter){
    int count = counter;
    if(l<r){
        int *p = partion(a,l,r,count);
        int p_index = p[0];
        QuickSort(a,l,p_index-1,count);
        QuickSort(a,p_index+1,r,count);
        count = p[1];
    }
    return count;
}


int main(){

    //int a[] = {7,2,1,6,8,5,3,4};
    int a[] = {7,2,8};
    int counter = QuickSort(a,0,2,0);

    //Comparisions count
    cout << "Number of comparisions performed = "<<counter<<endl;

    //Printing the array
    for(int i=0;i<3;i++)
    cout << a[i]<< " ";

    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

这应该足够了:

//Loop through the array and check if a[i] is less than pivot
for(int i=l;i<r;i++){
    if(a[i]<=pivot){
        swap(a[i],a[p_index]);
        p_index++;
    }
    counter++;
}
swap(a[p_index],a[r]);
p[0] = p_index;
p[1] = counter;
return p;

如评论中所述,交换不是比较。此外,当counter为真时,您只增加了a[i]<=pivot,但即使它是假的,您仍然进行了比较。

然而,从侧面说明,交换数量显然会影响性能,并且在比较排序算法时也经常考虑这种情况。