2 kiansoung kiansoung 于 2016.03.09 17:09 提问

Java快速排序,帮忙看一下下面的代码有没有错!

快速排序,下面的代码亲测,能够运行,结果也正确,但是我感觉怪怪的!想问一下红色框里的代码是不是有问题,希望解释一下图片说明

3个回答

cxsmarkchan
cxsmarkchan   2016.03.09 19:51
已采纳

没问题呀,这是快速排序的一种版本,是标准程序。
你也可以把array[low] = array[high]改成类似swap(array[low],array[high])这样的语句,更符合快速排序的交换思想(把小于index的交换到前面,把大于index的交换到后面)。
不过你会发现,如果这么修改,在(修改后的)第一个红框执行的时候,array[low]始终等于array[index],而(修改后的)第二个红框执行的时候,array[high]始终等于array[index],这就是为什么源码中不需要采用交换的原因(交换是3次赋值,比较浪费时间)。

yanggq1988
yanggq1988 回复kiansoung: 还有个index变量会保存数据
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复kiansoung: 最开始low == left, 而前面有一句index=array[left]。这时候,low这里的值已经有备份了,你可以看成low这里有一个空位。执行array[low]=array[high]的时候,这个空位挪到了high处。之后的每次赋值都是空位在和其他元素交换。这个空位的含义是分界点index应该在的位置,所以我说,这句话等价于swap(array[low], array[high]),只不过array[high]的值我们尚未填进去。直到最后,才有一句array[low]=index,把index填进去。
接近 2 年之前 回复
kiansoung
kiansoung 为什么排序完了,他还是存在啊!
接近 2 年之前 回复
kiansoung
kiansoung array[low] = array[high], array[low]被array[high]被替换,原先array[low]的值不就没有了吗?
接近 2 年之前 回复
yanggq1988
yanggq1988   2016.03.10 17:03

没有问题吧,红框里的代码也不在循环里面。

kiansoung
kiansoung   2016.03.11 15:31

我从新看了一下代码!好像没有什么问题,只是自己短路的

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!