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