快速排序的分治算法

叫喊太不容易了我终于懂了这个算法怎么写了!!!!

 

我百度到的挖坑法:

#include<iostream>
using namespace std;

template<class Type>
void Qsort(Type c[],int l,int r)
{
    if(l<r)
    {
        int q=Partition(c,l,r);
        Qsort(c,l,q-1);
        Qsort(c,q+1,r);
    }
}

template<class Type>

int Partition(Type b[],int left,int right)
{
    int i=left; 
	int j=right;
    int x=b[left];
    while(i<j)
    {
        while(b[j]>=x && i<j)
            j--;
        if(i<j)
        {
            b[i]=b[j];
            i++;
        }
        while(b[i]>=x && i<j)
            i++;
        if(i<j)
        {
            b[j]=b[i];
            j--;;
        }
    }
    b[i]=x;
    return i;
}


int main()
{
    int len;
    cout<<"请输入数组长度:";
    cin>>len;

    int *a=new int[len];

    cout<<"请输入数组元素:";
    for(int i=0;i<len;i++)
    cin>>a[i];

    Qsort(a,0,len-1);
    cout<<" 排序后的数组是 :";
    for(int j=0;j<len;j++)
        cout<<a[j]<<" ";
    cout<<endl;

    delete a;

    return 0;
}

 

书上的方法:

int Partition(Type b[],int left,int right)
{
    int i=left; 
	int j=right+1;
    int x=b[left];
    while(1)
	{
		while(b[++i]<x && i<right);
		while(b[--j]>x);
		if(i>=j) break;
		Swap(b[i],b[j]);
    }
    b[left]=b[j];
	b[j]=x;
    return j;
}

 这两种算法虽然思想上不是太一样,但是时间复杂度是一样的

 

Partition算法计算时间是O(n)

快速排序的运行时间与划分是否对称有关,如果划分成两个区为n-1和1,那么这是最坏情况


可以递归求得T(n)=O(n2)

扫描二维码关注公众号,回复: 396761 查看本文章

 

而如果每次划分所取得基准都恰好是中值,每次都划分为n/2的区域



 
 递归也可求得T(n)=O(nlogn)

        我得做个总结,这个快速排序快把我气死了,之前的算法学的还挺顺畅,到了这个算法还有归并排序的时候怎么都不对,我也找不出来结果。导致我刚刚对算法提起的那么一点点兴趣被浇灭了!然后将近一周都没有再去看算法。昨天又开始写了一下,终于知道我犯了什么错误。

        首先,我定义函数时,对不同的函数用了相同的形参,导致我的程序一直没有输出(急死人了叫喊),然后是Partition函数我定义的是void形式,但是这个函数是需要返回值的!不然在Qsort函数里就没办法给q赋值。现在总算是解决了这个小问题。大笑

猜你喜欢

转载自616306932.iteye.com/blog/2374192