【问题标题】:Count the number of component wise comparisons in quicksort algorithm.计算快速排序算法中组件明智比较的数量。
【发布时间】:2012-10-17 06:40:11
【问题描述】:

我正在尝试计算我的快速排序算法对数组大小为 500 的比较次数。我知道使用分区进行快速排序的最佳情况是 nlogn-n+1。因此,对于 500 的数组大小,组件比较的最佳情况数约为 3983。但是,当我运行我的代码时,我得到了 2400 次左右的比较,具体取决于随机函数生成的数组。我计算组件明智比较的数量是否错误?请帮忙。

#include <iostream>
    #include <string>
    #include <stdlib.h>
    using namespace std;


    int count_500 = 0;

    int partition(int *S,int l, int u);
    void swap(int &val1, int &val2);
    void Quicksort(int S[],int low, int hi);
    void exchange(int list[], int p, int q);
    int median_of_3(int list[], int p, int r);
    void Quicksort_M3(int S[], int low, int hi);





    int main()
    {
            int S1_500[500];
            int S2_500[500];
            int S3_500[500];

            int S1_200[200];
            int S2_200[200];
            int S3_200[200];

            int S1_8[8];
            int S2_8[8];
            int S3_8[8];

            srand ( time(NULL) );



            for(int i=0; i<500; i++)
            {
                    S1_500[i] = rand()%1000;
                    S2_500[i] = rand()%1000;
                    S3_500[i] = rand()%1000;
            }

            for(int i=0; i<200; i++)
            {
                    S1_200[i] = rand()%500;
                    S2_200[i] = rand()%500;
                    S3_200[i] = rand()%500;
            }

            for(int i=0; i<8; i++)
            {
                    S1_8[i] = rand()%100;
                    S2_8[i] = rand()%100;
                    S3_8[i] = rand()%100;
            }

            Quicksort(S1_500,0,499);
            for(int i=0; i<500; i++)
            {
                    cout << S1_500[i] << endl;
            }

            cout << "Number of component wise comparisons is: " << count_500 << endl;





    }


    int partition(int *S,int l, int u)
    {
            int x = S[l];
            int j = l;
            for(int i=l+1; i<=u; i++)
            {
                    if(S[i] < x)
                    {       
                            count_500++; // Count the component wise comparison
                            j++;
                            swap(S[i],S[j]);
                    }
            }
            int p = j;
            swap(S[l],S[p]);
            return p;
    }

    void swap(int &val1, int &val2)
    {
            int temp = val1;
            val1 = val2;
            val2 = temp;
    }

    void Quicksort(int S[],int low, int hi)
    {
            if (low < hi)
            {
                    int p = partition(S,low,hi);
                    Quicksort(S,low,p-1);
                    Quicksort(S,p+1,hi);
            }
    }

【问题讨论】:

  • 在 O 表示法中,通常省略前导(固定数字,例如 0.5)因子,因此通常您必须确保考虑此线性因子。这是@Henrik 在他的 awnser 中写的

标签: c++ algorithm quicksort


【解决方案1】:

您希望 count_500++;if 语句之外。你只计算比较,结果是true

改变

                if(S[i] < x) 
                {        
                        count_500++; // Count the component wise comparison 
                ...
                }

                count_500++; // Count the component wise comparison 
                if(S[i] < x) 
                {        
                ...
                }

【讨论】:

  • 哪个“结果”? if(S[i]
  • @user1493692 - 是的,但如果结果为假,您也应该增加计数器,而您目前没有这样做。
  • 这是有道理的。所以在 if 语句之外只会考虑这两种情况,对吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多