递归如何在这个快速排序程序中起作用?

时间:2015-01-29 16:50:51

标签: c++ arrays sorting quicksort

  

这是使用Quick Sort ..排序数组元素的代码。

void QuickSort(int a[], int beg, int end)
        {
            if(beg<end)
            {
                int p=Partition(a,beg,end);                       
                QuickSort(a,beg,p-1);                           
                QuickSort(a,p+1,end);                        
            }
        }
you can observe 
int p=Partition(a,beg,end);                      
     QuickSort(a,beg,p-1);                             
     QuickSort(a,p+1,end);  
     

在这个函数调用中,我还没有理解那些递归的方式   调用正在如何分配数组   快速排序(A,求,P-1);和QuickSort(a,p + 1,结束);因为我最终进入了   之间和当我干运行或调试它时,我感到困惑,因为它看起来像一个   合并排序...我知道快速排序的视觉表示(在youtube上看到)。   任何人都可以通过x [5]来解释我所有的迭代我感谢你们所有人   你的支持。

#include<iostream>
        #include<time.h>
        using namespace std;
        int z=0;
        int Partition(int a[], int beg, int end)          //Function to Find Pivot Point
        {
            int p=beg, pivot=a[beg], loc;
            for(loc=beg+1;loc<=end;loc++)
            {
                if(pivot>a[loc])
                {
                    a[p]=a[loc];
                    a[loc]=a[p+1];
                    a[p+1]=pivot;
                    p=p+1;
                }
            }
        return p;
        }


        void QuickSort(int a[], int beg, int end)
        {
            if(beg<end)
            {
                int p=Partition(a,beg,end);                       //Calling Procedure to Find Pivot
                QuickSort(a,beg,p-1);                             //Calls Itself (Recursion)
                QuickSort(a,p+1,end);                         //Calls Itself (Recursion)
            }
        }
        int function_Random(int x[1000],int i)
        {
            if(i==1001)
                return 0;
            x[z]=rand()%100;
            cout<<x[z]<<"\t";
            z++;
            function_Random(x,i+=1);
            //return x;
        }
        int main()
        {
            int s;
            static int i;
            int x[1000];
            begin=clock();
            function_Random(x,i);
            QuickSort(x,0,1000) ; 

        cout<<"\n\nAfter";
        for(i=0;i<1000;i++)
        {
            cout<<"\t"<<x[i];
        }
            return 0;
        }

2 个答案:

答案 0 :(得分:0)

递归是从自身调用一个函数。为了理解递归性,他必须首先理解递归性!

你实际上问的是基本上如何使用QuickSort以及它如何找到它的支点!

看看这本书: http://en.wikipedia.org/wiki/Introduction_to_Algorithms

它被认为是最好解释像quicksort这样的东西。

答案 1 :(得分:0)

我不确定究竟是什么问题,但如果您在非常高级别的视图中考虑QuickSort,它可能会有所帮助。

Quicksort的工作原理是选择一个元素作为枢轴,并将序列中的元素重新排序为两个子序列,其中较小和较大的值由枢轴分隔。此时枢轴已就位,您只需要独立对两个序列进行排序。

繁重的工作是通过分区完成的,该分区遍历将原始序列分成两个子序列并产生枢轴的最终位置的序列。请注意,分区完成后,数据透视表位于其最终位置,无需移动。

在您的情况下,枢轴被选为第一个元素,因此您将拥有:

initial:     [ pivot, other elements... ]
partitioned: [ smaller..., pivot, larger... ]

此时,您可以快速设置子序列[ smaller... ][ larger... ]

请注意,这与mergesort不同,在mergesort中您有一个固定的分割点,您可以单独对两个子序列进行排序,然后通过合并结果来构建整体解决方案。在快速排序中,您选择一个元素将其移动到正确的位置,将宇宙分成更小/更大的值,形成两个子序列,分割点由枢轴的值和所有其他元素的相对值确定。