我正在准备考试,目前正在学习快速入学。
说我应该为阵列进行快速干运行
8,6,2,7,1,4,3,5
我的朋友说我做错了,因为在快速排序中,它会同时移动索引和交换。所以基本上在我下面的步骤中,我可以跳过只移动i, j
的步骤。所以他说我需要同时移动和交换。你能说他是对的吗?我觉得这一切都很好..请告诉我,因为我现在不确定考试......
我有索引i
它会遍历数组,直到找到比pivot元素更大的元素。 j
是低于pivot元素的索引。而P是枢轴元素。 ||
表示元素处于正确位置,即已排序。
8,6,2,7,1,4,3,5
i j P
3,6,2,7,1,4,8,5
i j P
3,4,2,7,1,6,8,5
i j P
3,4,2,7,1,6,8,5
i j P
3,4,2,1,7,6,8,5
j i P
3,4,2,1,|5|,6,8,7
j P i
3,4,2,1,|5|,6,8,7
i j P
3,4,2, 1, |5|,6,8,7
i Pj
1,4,2, 3, |5|,6,8,7
i Pj
1,4,2,3,|5|,6,8,7
i j P
1,2,4,3,|5|,6,8,7
j i P
1,2,|3|,|4|,|5|,6,8,7
j P i
1, 2, |3|,|4|,|5|,6,8,7
i Pj
1, 2, |3|,|4|,|5|,6,8,7
j Pi
|1|, |2|,|3|,|4|,|5|,6,8,7
j Pi
|1|,|2|,|3|,|4|,|5|,6,8,7
i j P
|1|,|2|,|3|,|4|,|5|,6,8,7
j i P
|1|,|2|,|3|,|4|,|5|,|6|,|7|,|8|
j P i
这是他的版本。比我短得多,因为他没有像我这样的额外步骤移动索引。所以他的步数比我少两倍。你认为是对的吗?
答案 0 :(得分:3)
从考试的角度来看,我认为你的版本似乎更合适,因为你在考试中更好地阐述每一步。
在您朋友的版本中,由于没有left(i)
和right(j)
迭代器以及pivot
元素的指示,审核员对答案不会非常满意。
从实现的角度来看,你们两个基本上做同样的事情,只是你展示了迭代器的移动以及单独交换值,但这并没有改变<算法的强>语义。
如果你仔细看,它是一样的:
您强>
swap(array[i] , array[j])
i = i + 1
j = j - 1
<强>朋友强>
swap(array[i++] , array[j--])