例子
public void quick(int[]array,int left,int right){
//终止条件
if (left>=right){//这里为什么要取>,只取=号不行吗?
return;
}
//
int part=partition(array, left, right);
//开始递归
quick(array,left,part-1);
quick(array,part+1,right);
}
答:特殊情况数组 1 2 3 4 5
1就是基准 下一次循环: left就会>right
问题:
1.左边做key,为啥右边end先走
2.array[end]<=key 和array[start]>=key 部分为什么要取=号
public int partition(int[]array,int start,int end){
int i=start;//保存下来
int key=array[start];//保存下来
while (start<end){
//这里为什么要取=
while (start<end&&array[end]>=key){//循环停下来的是比key小的数
end--;
}
while (start<end&&array[start]<=key){
start++;
}
Swap(array,start,end);
}
Swap(array,start,i);//最后一次交换
return start;
}
交换函数
private void Swap(int[]array,int i,int j){
int temp=array[i];
array[i]=array[j];
array[j]=temp;
}
1..时间复杂度:O(N*logN)
2. 空间复杂度:O(logN)
3. 稳定性:不稳定
在数量过大的情况下,递归的太深-栈溢出情况