美文网首页PHP架构计算机杂谈每天写1000字
【编程能力不行?那就写啊!】快速排序详解

【编程能力不行?那就写啊!】快速排序详解

作者: 张照博 | 来源:发表于2017-12-21 11:42 被阅读144次

    正文之前

    这是最后的存货了。刚才看了下主页,不知不觉就写了两百篇了真是神奇!缘,妙不可言

    正文

    下面是代码,我来一个个解释

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    void swap(int &a,int &b)
    {
        int tmp=a;
        a=b;
        b=tmp;
    }
    
    int times=0;
    

    👇下面这段是全文的重点,对于一个数组,要进行分治处理,那么我们需要知道到底在哪儿进行分割,当然,也可以无脑的二分法,但是这样的话对于一些情况就会产生很不好的效率,而且我们这个也是二分,但是没有对称的分配。


    如上图所示⤴️,我们对于一段数组,先取最后一个数作为我们分割点,然后黑线向前推进,如果发现黑线后的数比分割点小,那么就丢到前面准备的一个位置,也就是那一句swap(a[i],a[j]); 在此过程中++i是必不可少的,这样到了最后,在i之前的就都是分割点小,比分割点大的都在i后面,然后把分割点跟i的下一个位置置换,那么不论前后多少个书,分割点的位置是确定的。剩下的只要分治分割点前后的两段数组罢了!等到最后无法继续分割了,就意味着分治完毕,排序完成!

    int Partition(int a[],int p,int r)
    {
        int ZhuYuan=a[r];
        int i=p-1;
        for (int j=p; j < r; ++j)
        {
            if(a[j]<=ZhuYuan)
            {
                ++i;
                ++times;
                swap(a[i],a[j]);
            }
        }
        swap(a[i+1],a[r]);
        return i+1;
    }
    
    void Quick_Sort(int a[],int p,int r)
    {
        if (p<r)
        {
            cout<<p<<" -- "<<r<<endl;
            int q=Partition(a,p,r);
            Quick_Sort(a,p,q-1);
            ++times;        
            Quick_Sort(a,q+1,r);
        }   
    }
    

    下面看效果吧!!

    
    int main()
    {
        int a[101];
        for (int i = 0; i<100; ++i)
        {
            a[i]=rand()%1000;
        }
        Quick_Sort(a,0,100);
        for(int s=1;s<100;++s)
        {
            if(s%8==0)
                cout<<endl;
            cout<<a[s]<<" --> ";
        }
        cout<<endl;
        cout<<times<<endl;
        return 0;
    }
    

    完整代码奉上:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    void swap(int &a,int &b)
    {
        int tmp=a;
        a=b;
        b=tmp;
    }
    
    int times=0;
    int Partition(int a[],int p,int r)
    {
        int ZhuYuan=a[r];
        int i=p-1;
        for (int j=p; j < r; ++j)
        {
            if(a[j]<=ZhuYuan)
            {
                ++i;
                ++times;
                swap(a[i],a[j]);
            }
        }
        swap(a[i+1],a[r]);
        return i+1;
    }
    
    void Quick_Sort(int a[],int p,int r)
    {
        if (p<r)
        {
            cout<<p<<" -- "<<r<<endl;
            int q=Partition(a,p,r);
            Quick_Sort(a,p,q-1);
            ++times;        
            Quick_Sort(a,q+1,r);
        }   
    }
    
    
    
    int main()
    {
        int a[101];
        for (int i = 0; i<100; ++i)
        {
            a[i]=rand()%1000;
        }
        Quick_Sort(a,0,100);
        for(int s=1;s<100;++s)
        {
            if(s%8==0)
                cout<<endl;
            cout<<a[s]<<" --> ";
        }
        cout<<endl;
        cout<<times<<endl;
        return 0;
    }
    

    正文之后

    相对来说,快速排序🔜代码比较简单,对于数据结构的要去不高,只要你能理解分治的概念,并且对于数组有着较好的把握,那么应该就很好理解了!

    相关文章

      网友评论

        本文标题:【编程能力不行?那就写啊!】快速排序详解

        本文链接:https://www.haomeiwen.com/subject/ginowxtx.html