错误总结:(以成功版本为例)
void quickSort(int a[],int l,int r){
if(r<=l) return;//不能写(r-l<=1)这样遍历会少一次
int low=l,high=r; //不能直接把low high当参数,因为和l r含义不同,需要左右边界(l r),也需要不停变动的左右指针(low high)
int selected=a[low];//书上是把被选中元素放到a[low-1]中,和新建一个selected变量没有区别
//记得最后把selected放到中间位置
while(low<high){
while(a[high]>selected)
high--;//为什么不能写成 while(a[high--]>selected);的形式??
while(a[low]<selected)
low++;
Swap(a[low],a[high]);
}
if(low==high){//==不要写成=
cout<<low<<endl;
// a[low]=selected;
quickSort(a,l,low-1);和归并的区别之一:归并分两组,快排严格分为三部分
quickSort(a,low+1,r);
}
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
int main()
{
int a[100]={ 20,10,90,99,40,50,30,60,80 ,70 };
quickSort(a,0,9);
return 0;
}
错误总结2:(以失败版本为例)
void quickSort(int a[],int l,int r){
if(r-l<=1) return;//错
int low=l,high=r;
int selected=a[low];
cout<<a[low]<<" "<<a[high]<<endl;
//这里对快排定义理解错,不是在右边找到大的元素就放到左边,而是交换左右两边的元素,这样查找成功两次,交换一次,效率更高
while(a[high]>selected&&low<high)//分为两部分:low<high and low==high
high--;
if(a[high]<=selected) a[low]=a[high];//理解错误
while(a[low]<selected&&low<high)
low++;
if(a[low]>selected) a[high]=a[low];
if(low=high){//==
a[low]=selected;
quickSort(a,l,low-1);
quickSort(a,low+1,r);
}
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
}
int main()
{
int a[100]={ 20,10,90,99,40,50,30,60,80 ,70 };
quickSort(a,0,9);
return 0;
}