template<class Type>
int partition(SqList<Type>& List,int low,int high)
{
ElementType<Type>elem=List.elem[low];//以数组的第一个数作为基准数
Type pivotkey=elem.key;//基准数赋值
int i=low,j=high;
while(i<j)//大循环控制搜索结束条件,i>=j时搜索结束
{
while(i<j&&elem[j]>=pivotkey)j--;//当从右边往左搜索时,找第一个小于基准数的数
if(i<j){elem[i]=elem[j];i++;}//找到了,将该数赋值到i所在的位置,因为i是从左往右的。
while(i<j&&elem[i]<=pivotkey)i++;
if(i<j){elem[j]=elem[i];j++}
}
List.elem[j]=elem;//最后将基准数赋值到中间位置,也就是大小分界线位置
return j;//返回分界线位置
}
快排的一次排序结果。
template<class Type>void Quicksort(SqList<Type>& List,int low,int high)
{
if(low<high)
{
int pivot=partition(List,low,high);
Quicksort(List,low,pivot-1);
Quicksort(List,pivot+1,high);
}
}
感觉这个版本的排序思路清晰,以后遇到类似的就用此版本。