太不容易了我终于懂了这个算法怎么写了!!!!
我百度到的挖坑法:
#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)
而如果每次划分所取得基准都恰好是中值,每次都划分为n/2的区域
递归也可求得T(n)=O(nlogn)
我得做个总结,这个快速排序快把我气死了,之前的算法学的还挺顺畅,到了这个算法还有归并排序的时候怎么都不对,我也找不出来结果。导致我刚刚对算法提起的那么一点点兴趣被浇灭了!然后将近一周都没有再去看算法。昨天又开始写了一下,终于知道我犯了什么错误。
首先,我定义函数时,对不同的函数用了相同的形参,导致我的程序一直没有输出(急死人了),然后是Partition函数我定义的是void形式,但是这个函数是需要返回值的!不然在Qsort函数里就没办法给q赋值。现在总算是解决了这个小问题。