我不知道';我不理解这个快速排序实现 我有一个C++中的QuaseQuoice代码,它对于非唯一元素的数组非常有效。我相信这里很多人都知道,但是,谁能理解呢?让我解释清楚。代码如下: void quicksort(int a[], int first, int last){ int i,j; int pivot; if((last -first + 1) <= 1) return; pivot = a[(first+last) / 2]; i = first; j = last; while(i <= j){ while(a[i] < pivot) i++; while(a[j] > pivot) j--; if(i <= j){ //SWAP int temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; } } quicksort(a, first, j); quicksort(a,i, last); } void快速排序(int a[],int first,int last){ int i,j; int轴; 如果((last-first+1)

我不知道';我不理解这个快速排序实现 我有一个C++中的QuaseQuoice代码,它对于非唯一元素的数组非常有效。我相信这里很多人都知道,但是,谁能理解呢?让我解释清楚。代码如下: void quicksort(int a[], int first, int last){ int i,j; int pivot; if((last -first + 1) <= 1) return; pivot = a[(first+last) / 2]; i = first; j = last; while(i <= j){ while(a[i] < pivot) i++; while(a[j] > pivot) j--; if(i <= j){ //SWAP int temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; } } quicksort(a, first, j); quicksort(a,i, last); } void快速排序(int a[],int first,int last){ int i,j; int轴; 如果((last-first+1),c++,duplicates,quicksort,elements,C++,Duplicates,Quicksort,Elements,如果在开始时,一个[i]>轴(因此i没有改变)和一个[j]>轴用于所有j,直到[j]=轴,循环的下一次迭代将导致j2,那么i没有改变。a[4]>2,j--,a[3]>2,j--,a[2]=2,现在我们点击了if语句。02,所以i没有改变。a[j]>2,所以j--,j现在是0。a[j]不大于2(因为它是2),j保持在0。现在,我们有i=1和j=0,或者i>j 如果您注意到,2处于“已排序”位置,不需要再移动。此外,枢轴是数组中最小的元素。希望这能帮助您找到答案。如果在开始时,一个[i]>枢轴(因此

如果在开始时,一个[i]>轴(因此i没有改变)和一个[j]>轴用于所有j,直到[j]=轴,循环的下一次迭代将导致j 为了说明

以以下数组为例:

int a[] = [10, 7, 2, 6, 3];
在第一次调用quicksort时,first是0,last是4(数组中的最后一个索引),pivot将是a[2]=2。在第一次迭代中,如果while循环,a[0]>2,那么i没有改变。a[4]>2,j--,a[3]>2,j--,a[2]=2,现在我们点击了if语句。02,所以i没有改变。a[j]>2,所以j--,j现在是0。a[j]不大于2(因为它是2),j保持在0。现在,我们有i=1和j=0,或者i>j


如果您注意到,2处于“已排序”位置,不需要再移动。此外,枢轴是数组中最小的元素。希望这能帮助您找到答案。

如果在开始时,一个[i]>枢轴(因此i不会更改)和一个[j]>枢轴代表所有j,直到[j]=pivot,循环的下一次迭代将导致j 为了说明

以以下数组为例:

int a[] = [10, 7, 2, 6, 3];
在第一次调用quicksort时,first是0,last是4(数组中的最后一个索引),pivot将是a[2]=2。在第一次迭代中,如果while循环,a[0]>2,那么i没有改变。a[4]>2,j--,a[3]>2,j--,a[2]=2,现在我们点击了if语句。02,所以i没有改变。a[j]>2,所以j--,j现在是0。a[j]不大于2(因为它是2),j保持在0。现在,我们有i=1和j=0,或者i>j


如果您注意到,2处于“已排序”位置,不需要再移动。此外,枢轴是数组中最小的元素。希望这能帮助您解决这个问题。

i
j
从数组的任一端开始,直到找到大于枢轴的值(
a[i]
)并且小于轴(
a[j]
)。当发现两个这样的值时,它们是交换位置,因此最终得到一个数组,其中循环后
i
到末尾大于轴,开始到
j
小于轴。我们在这两个子数组上递归


<代码> i> j>代码:当列表被枢轴值分割时,<代码> > <代码>和<代码> j>代码>已覆盖数组中的每一个值,以确保它位于枢轴的正确一侧。这可能发生在数组的中间,或者只有一个值根据列表中的枢轴值在哪里交换。T可以是最大值或最小值,也可以是值列表中间的值。

< P> <代码> i < /> >和代码> j>代码>从数组的两端开始,直到找到大于枢轴的值(<代码> A[i] < /代码>),小于枢轴(<代码> A[j] < /代码>)。当找到两个这样的值时,它们是交换位置,因此您最终得到一个数组,其中循环
i
后到结尾的值大于轴,而
j
的开始值小于轴。我们在这两个子数组上递归


<代码> i> j>代码:当列表被枢轴值分割时,<代码> > <代码>和<代码> j>代码>已覆盖数组中的每一个值,以确保它位于枢轴的正确一侧。这可能发生在数组的中间,或者只有一个值根据列表中的枢轴值在哪里交换。T可以是最大值或最小值,或者它可以在值列表中间。

看起来像C代码,不是C++。我认为交换函数是C++的,不是吗?在C++中有<代码> STD::SWIFT < /COD>。但是没有看到其余代码,很难知道这里使用的是交换。不是严格意义上的C,但好吧,我编辑了标题,现在我们可以深入讨论了吗?@PaulR除了使用
swap()
函数(假设其
std::swap()
)这是一个好的C和C++代码的例子,这看起来像C代码,不是C++。我认为交换函数是C++的,不是吗?在C++中有<代码> STD::SWIFT < /COD>。但是不看代码的其余部分,很难知道这里使用的是什么交换。我认为它不是严格的C,而是OKY,我编辑了T。ITLE,现在我们可以深入到它了吗?@ PaulR,除了使用代码> SWAP-()/Cux>函数(假设它的代码> STD::SWAP-()/代码>,这是一个好C和良好C++代码的一个例子,就是那个!谢谢:)就是这个!谢谢: