本帖最后由 蓝迪 于 2012-8-31 11:42 编辑
- do
- {
- while(strDate[i].compareTo(middle)<0&& i<j)
- i++; //找出左边比中间值大的数
- while(strDate[j].compareTo(middle)>0&& j>i)
- j--;//找出右边比中间值小的数
- if(i<=j){ //将左边大的数和右边小的数进行替换
- tempDate=strDate[i];
- strDate[i]=strDate[j];
- strDate[j]=tempDate;
- System.out.println(strDate[i]+" "+strDate[j]);
- i++;
- j--;
- }while(i<=j);
复制代码 问题1将do-while循环中left right 改为 i j的解答
compareTo方法 : 是按照字典顺序比较两个字符串
比如 a.compareTo(b); 如果a字符在字典中拍在b的前面,返回-1,如果a等于b,返回0,如果a的位置大于b,返回1
所以流程是这样的,程序开始 middle = 0;
当循环第1次,i=0时 strDate=11 ,strDate.compareTo(middle) (11比0大) 返回的是1 ,所以1<0不成立 跳出循环
j=7 strDate[j]=32 strDate[j].compareTo(middle) (32比0大) 返回的是1 ,所以1>0 且 j>i(7>0) 成立j--(j=6) 继续循环
j=6 strDate[j]=0 strDate[j].compareTo(middle) (0等于0) 返回的是0 ,所以0>0 不成立 跳出循环
if(i<=j)//(0<6) 成立,strDate(11) 与 strDate[j](0) 互换位置
现在数组中的位置是 "0","66","22","0","55","22","11","32"
然后就是i++(i=1) j--(j=5)
循环第2次 i=1 strDate=66 大于 middle (0) 返回的是1 条件不成立
j=5 strDate[j]=22 大于 middle (0) 返回的是1 条件成立 j--(j=4) 继续循环
j=4 strDate[j]=55 大于 middle (0) 返回的是1 条件成立 j--(j=3) 继续循环
j=3 strDate[j]=0 strDate[j].compareTo(middle) (0等于0) 返回的是0 ,所以0>0 不成立 跳出循环
if(i<=j)//(1<3) 成立,strDate(66) 与 strDate[j](0) 互换位置
现在数组中的位置是 "0","0","22","66","55","22","11","32"
然后就是i++(i=2) j--(j=2)
循环第3次 因为还在do中,所以即使角标为3的0 已经跟 66互换了 middle 也还是0
i=2 strDate=22 大于 middle (0) 返回的是1 条件不成立
j=2 strDate[j]=22 大于 middle (0) 返回的是1 条件成立 j--(j=1) 继续循环
j=1 strDate[j]=0 strDate[j].compareTo(middle) (0等于0) 返回的是0 ,所以0>0 不成立 跳出循环
if(i<=j) //(2<=1) 不成立,位置不变化
数组位置仍是 "0","0","22","66","55","22","11","32"
因为 i>j 所以跳出do-while
if(i<right)
{
quickSort(strDate,i,right);//从
}
因为 i < 7 所以条件成立,进行递归 把i=2 right=7复制进去
然后i=2 j=7 重新循环,以此类推
楼主能推出了吗 |