对于quicksort哪个干运行是正确的?困惑

时间:2017-08-19 12:39:55

标签: algorithm sorting quicksort

我正在准备考试,目前正在学习快速入学。

说我应该为阵列进行快速干运行

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

这是他的版本。比我短得多,因为他没有像我这样的额外步骤移动索引。所以他的步数比我少两倍。你认为是对的吗?

enter image description here

1 个答案:

答案 0 :(得分:3)

从考试的角度来看,我认为你的版本似乎更合适,因为你在考试中更好地阐述每一步

在您朋友的版本中,由于没有left(i)right(j)迭代器以及pivot元素的指示,审核员对答案不会非常满意。

从实现的角度来看,你们两个基本上做同样的事情,只是你展示了迭代器的移动以及单独交换值,但这并没有改变<算法的强>语义。

如果你仔细看,它是一样的:

swap(array[i] , array[j])
i = i + 1
j = j - 1

<强>朋友

swap(array[i++] , array[j--])