Data structures 在这种情况下,可以快速理解排序
我正在修改快速排序算法,但是它比我想象的要复杂一些 假设我的数组有以下Data structures 在这种情况下,可以快速理解排序,data-structures,quicksort,Data Structures,Quicksort,我正在修改快速排序算法,但是它比我想象的要复杂一些 假设我的数组有以下A={7,1,5,8,2,0} 现在我选择我的pivot作为数组的索引2,它的值为5。(最终,所有小于5的元件将位于左侧,大于5的元件将位于右侧) 现在我开始从左(索引0)向右(索引2)移动,直到达到大于5的值。如果左侧的值大于轴值5,则需要移动到右侧。要将其移动到右侧,需要一个空插槽,以便两个值可以互换。第一次交换给了我数组 A = {0,1,5,8,2,7} 现在两个元素仍然保留在左侧,即2和7(右侧也向枢轴方向移动-向
A={7,1,5,8,2,0}
现在我选择我的pivot作为数组的索引2,它的值为5。(最终,所有小于5的元件将位于左侧,大于5的元件将位于右侧)
现在我开始从左(索引0)向右(索引2)移动,直到达到大于5的值。如果左侧的值大于轴值5,则需要移动到右侧。要将其移动到右侧,需要一个空插槽,以便两个值可以互换。第一次交换给了我数组
A = {0,1,5,8,2,7}
现在两个元素仍然保留在左侧,即2和7(右侧也向枢轴方向移动-向左,如果小于th epivot,则假定移动到另一侧)。
现在的问题是,如果右侧没有插槽,左侧的元素需要移动到轴的右侧,会发生什么?我遗漏了什么吗?好吧,您正在谈论的“分区”步骤可以通过多种方式实现
实施imo的最简单方法是:
1) 选择一个轴元素
2) 将轴元素作为最右边的元素移动
3) 进行左扫描,并按顺序堆叠所有小于pivot的元素
4) 最后,您知道有多少元素更小->进行最终交换以确保轴心元素最终位于正确的位置
我从维基上获取了这一点,并在代码中添加了一些步骤,只是为了让它更清晰
//left是子数组最左侧元素的索引
//right是子阵列(包括)最右侧元素的索引
//子阵列中的元素数=左+右+1
分区(数组、左、右)
pivotIndex:=choosePivot(数组,左,右)//步骤1
数据透视值:=数组[数据透视索引]
交换数组[pivotIndex]和数组[right]//步骤2
storeIndex:=左
对于i,从左到右-1//步骤3
如果数组[i] return storeIndex
快速排序的基本思想是
选择一个轴图元,并尝试将小于“左轴”的所有图元放置到轴图元,大于或等于“右轴”的所有图元。这个过程是递归发生的
当你们选择5时,一个从左边来的点和另一个从右边来的点互相移动,比较每个元素和枢轴,如果这两个指针交叉,你们就用枢轴交换左指针
在第一种情况下,您已经交换了0和7,这很好,但是现在索引从一个点前进,现在左指针指向元素1,右指针指向2。右指针停止在2,因为它小于枢轴5。左指针到达8并交换8和2。指针再前进一次,左指针越过右指针,因此它与2交换
现在如果你看到,5在正确的位置。
看起来像
0,1,2,5,8,7
链接有用:
算法:
//left是子阵列最左侧元素的索引
//right是子阵列(包括)最右侧元素的索引
//子阵列中的元素数=左+右+1
分区(数组、左、右)
pivotIndex:=choosePivot(数组,左,右)
数据透视值:=数组[数据透视索引]
交换数组[数据透视索引]和数组[右]
storeIndex:=左
对于i,从左到右-1
如果数组[i]
pivotIndex := choosePivot(array, left, right)
pivotValue := array[pivotIndex]
swap array[pivotIndex] and array[right]
storeIndex := left
for i from left to right - 1
if array[i] < pivotValue
swap array[i] and array[storeIndex]
storeIndex := storeIndex + 1
swap array[storeIndex] and array[right] // Move pivot to its final place
return storeIndex