java - (快速排序算法的)分区方法中的存储变量在做什么?
问题描述
我正在研究快速排序算法的这个简单实现。
我在使用分区方法时遇到问题。我重新命名了变量以帮助我理解。我了解大部分方法,但有一个变量我不明白它的用途。这就是store
变数。
这是我的这种方法的版本:
private int partition(int[] array, int startIndex, int endIndex)
{
int pivotIndex = getPivot(startIndex, endIndex);
swapElements(array, pivotIndex, endIndex);
pivotIndex = endIndex;
int store = startIndex;
for(int currentIndex = startIndex; (currentIndex <= endIndex - 1); currentIndex++)
{
if(array[currentIndex] <= array[pivotIndex])
{
swapElements(array, currentIndex, store);
store++;
}
}
swapElements(array, store, pivotIndex);
pivotIndex = store;
return pivotIndex;
}
store
变量的目的是什么?如果startIndex
并且currentIndex
已经指向数组的第一个索引,为什么需要store
做同样的事情?它在做什么?
解决方案
要回答您更简单的问题,您应该能够看到随着迭代的进行store
并没有保持不变。只有在特定迭代为真时currentIndex
才会增加。array[currentIndex] <= array[pivotIndex]
- 所以store
通常会小于currentIndex
.
更具体地说,发生的事情是您pivotIndex
在开头选择了指向某个值的 a。然后您在表中移动元素,以便所有小于该pivotIndex
值的值在数组中的该值之前,并且所有大于该pivotIndex
值的值在数组中的该值之后。store
正在跟踪将发现小于该pivotIndex
值的下一个值移动到何处。该值被移动到该store
位置,然后store
递增以超过该值并表示下一个较小值应放置的位置。
在迭代结束时,store
设计指向枢轴值应该在的位置,因为之前的所有值store
都小于该值,而之后的所有值store
都大于该值。所以最后,枢轴值移动到 指向的位置store
,并store
成为分区操作的最终索引,该索引指向枢轴值
推荐阅读
- java - 如何在 Thymeleaf SpringBoot 中显示哈希图中的键值对
- angular - 将对象属性设置为父元素的属性
- typescript - TypeError: object null is not iterable (cannot read property Symbol(Symbol.iterator)) player.call('client:showHouseInMenu'
- list - Flutter 如何将 groupedBy 附加到列表中?
- python - pyqt5 运行缓慢
- c# - 如何从另一个范围访问线程?
- python - 通过分隔符拆分特殊模式而不将其从字符串中删除?
- r - 为先前保存的 sessionInfo() 数据创建新的 R 会话匹配详细信息
- mysql - 如何从 pymysql.converters.escape_string 中转义数据
- woocommerce - 带有 GA4 查询的 Wocomerce 直接结帐 URL