//p,r分别是这个要排序的区段的下标
int partion(int *arElem, int p, int r)
{
int x = arElem[r];
int i = p,j = p;
for(; i < r; i++)
{
if(arElem[i] < x)
{
if(i != j)
{
exchange(arElem, i, j);
}
j++;
}
}
exchange(arElem, j, r);
return j;
}
这里主要思想是将这个区间最后一位作为参照数,将比这个数小的数放到左边,比这个数大的数放到右边
i和j分别代表什么:
i是遍历数组用的,指向当前遍历到的数,j总是期望是指向比参照数大的数。
因为只要当前遍历到的数比参照数小,i和j都是同步增长的
当前数如果比参照数大(或等于),那么j就不动了,所以说j期望指向比参照数大的数
在j已经指向比参照数大的数这种情况下,如果当前数比参照数小,那么就会将i和j所指的数交换,并且i和j都向右移动一位。这时候,j肯定是指向比参照数大的数的(自己分析)。
即,如果数组中间有比参照数大的数,j会一直指向比参照数大的数;如果数组中间没有比参照数大的数,j会指向最后的参照数。
所以最后将参照数和j交换就很容易理解了。
本文深入探讨快速排序算法的核心思想及其实现细节,详细解释了算法中i和j变量的作用,以及如何通过分区操作实现数据的有效排序。通过分析快速排序的关键步骤,读者将对算法的高效性和工作原理有更深刻的理解。

1万+

被折叠的 条评论
为什么被折叠?



