系统学习qsort1 尤其partition

void QuickSort1(int *data, int l, int u){

if (l>=u)return;//递归出口

// divide

int m=l;

for(int i=l+1;i<=u;i++){

if( data[i] <data[l])//品味这个条件

swap(data,++m ,i );

//三月份的这个版本,最大的发现就是:

//data[m]存储的是:当前比data[l]大的第一个元素。详细品味那个图

//cout<<"debug divide in quicksort "<<data[m]<<endl;

}

swap(data,l,m);//why??

 

// 特别的,我把这个不等式放在这儿:

// x [1..m-1 ] <x [m] <= a[m+1...u]

 

QuickSort1(data,l,m-1);

QuickSort1(data,m+1,u);

}

 

void QuickSort2(int *data,int l,int u){

int i,j;

if(l>=u)return;

int temp;

 

temp=data[l];

i=l;

j=u+1;//两个界限都比以前大step 1

 

while (true)

{ do i++; while(i<=u && data[i] <temp); //想想这里的上届下界?

do j--; while( j>=l && data[j] >temp); //66 add ..

if (i>j)

{break;

}

swap(data, i ,j);//测试,这里用i 一样吧??

}

//when i==j 退出

 

swap(data,l,j); //细节

QuickSort2(data,l,j-1);//不是j

QuickSort2(data,j+1,u);

 

}

 

int cutoff=1;//为寻找最优设置。

void QuickSort3(int *data,int l, int u){

 

int i,j;

if ( u-l <cutoff ) return ; //cutofff

swap(data, l, rand() % (u -l) +1);

int temp;

 

temp=data[l];

i=l;

j=u+1;

 

while (true)

{

do i++; while( i<=u && data[i] < temp);

do j--; while( data[j] >temp);

if (i>j)

{break;

}

int t=data[i]; data[i]=data[j];data[j]=t;

 

}

swap(data,l,j);

QuickSort3(data,l,j-1);

QuickSort3(data,j+1,u);

 

}

 

 

源文档 <file:///C:\Documents%20and%20Settings\Administrator\桌面\cache1.doc>

原文地址:https://www.cnblogs.com/titer1/p/2451304.html