T(n)=2T(n/2)+f(n)----f(n)-O(n),因为实际上我们对每一层递归树进行划分的时候,都是将整个数组都遍历了一遍
T(n)=4T(n/4)+2f(n)
...log2N=k,共进行k次
T(n)=nT(1)+kf(n)=O(n)+kO(n)==kO(n)=O(n*logn)
T(n)=T(1)+T(n-1)+f(n)=nT(1)+(n-1)f(n)=O(n*n)
QUICKSORT(A, p, r)//快速排序算法
if (p < r )
{
q = PARTITION(A, p, r)//分成左右两半,一半不大于A[r], 一半不小于A[r]
QUICKSORT(A, p, q-1)//递归左半
QUICKSORT(A, q+1, r) //递归右半
}
PARTITION(A, p, r)
x = A[r]//选择最后一个元素作为比较元素
i = p – 1//这个慢速移动下标必须设定为比最小下表p小1,否则两个元素的序列比如2,1无法交换
for j = p to r-1//遍历每个元素
{
if (A[j] <= x)//比较
{
i = i + 1//移动慢速下标
Exchange A[i] with A[j ]//交换
}
}
Exchange A[i+1] with A[r]//交换
return i + 1//返回分割点
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cstdlib"
#define N 100
using namespace std;
template class Qsort;
template
ostream& operator<<(ostream&,Qsort&);
template
istream& operator>>(istream&,Qsort&);
template //算法导论的版本
class Qsort
{
public:
Qsort()
{
memset(data,0,sizeof(data));
num=0;
}
friend ostream& operator<<<>(ostream&,Qsort&);
friend istream& operator>><>(istream&,Qsort&);
int partion(int,int);
void sort(int,int);
void presort()
{
sort(1,num);
}
void swap(int i,int j)
{
T t=data[j];
data[j]=data[i];
data[i]=t;
}
private:
T data[N];
int num;
};
template
ostream& operator<<(ostream& out,Qsort& k)
{
cout<<"Qsort结果如下:"<
istream& operator>>(istream& in,Qsort& k)
{
cout<<"please input the number of your data!"<>k.num;
for(int i=1;i<=k.num;i++) cin>>k.data[i];
return in; //为了实现流的连续输入
}
template
int Qsort::partion(int left,int right)
{
T key=data[right];
int i=left-1;
int j=left;
for(;j
void Qsort::sort(int left,int right)
{
if(left>=right) return ;
int q=partion(left,right);
sort(left,q-1);
sort(q+1,right);
}
int main()
{
Qsort my1;
Qsort my2;
cin>>my1>>my2;
my1.presort();
my2.presort();
cout<
//---test.h
#ifndef test_h_
#define test_h_
#include
using namespace std;
// 改动一:增加函数模板的声明——而这又需要先声明类模板
template class Test;
template
void display(Test &t);
template
class Test
{
private:
T x;
public:
Test (T x_): x(x_) {}
friend void display<>(Test &t);
// 改动二:在函数名后面加上<>,指明它是之前声明的函数模板 的实例
};
template
void display(Test &t)
{
cout << t.x << endl;
}
#endif // test_h_
void quicksort(int left,int right)
{
if(left>right) return ;
else
{
int i=left;
int j=right;
T t;
T temp=data[left];
while(i!=j)
{
while(i=temp) j--; //记住必须先动j
while(i