【重新上本科】快速排序【下】

本文深入探讨了快速排序算法的一种实现方式,通过仅从一个方向遍历来完成交换任务,详细解释了算法的核心思想、步骤及代码实现,强调了理解算法原理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我的印象中,绝大多数的教科书讲解快速排序的时候,都用严蔚敏书中的方法,采用左右两个迭代指示器,从两个方向进行遍历比较。能不能只从一个方向进行遍历,遍历一遍就能完成交换任务呢?《算法导论》提供了一种方法。


《算法导论》是从左到右遍历,设定两个指示器(从这个角度来说本质上与严蔚敏的方法一致),一个指示器指示当前遍历的位置,另一个指示的位置,该位置之前的元素(直到数组起始位置)的值都小于锚值,该位置之右的元素的数值都大于锚值。随着第一个指示器的遍历,遇到比锚值小的元素,就与第二个指示器指示的位置的元素交换,两个指示器分别向右移动一个位置,直到第一个指示器遍历完整个数组。这部分代码如下:

int i = iLow;                               // 遍历指示器i,i左边的元素都比锚值小,右边的元素都比锚值大
int iVal = Array[iHigh];               // 锚值设定为最后一个元素,与上面两种方法不同,这个取决于遍历数组的方向,总在该方向末尾的元素
for (int j=iLow; j<iHigh; j++)       // 便利指示器j,用于遍历整个数组的元素,在遍历过程中,j >= i,等号只在开始遍历时成立
{

if (Array[j] <= iVal)        // 当j位置元素小于锚值时,两者交换(此时位置i的元素一定大于锚值),两个指示器均右移,此时区间 [i,j)的数值均大于锚值
{
int iTemp = Array[i];
Array[i] = Array[j];
Array[j] = iTemp;
i++;
}

}
int iTemp = Array[i];                  // 边界情况,当跳出循环,将Array[iHigh]存放的锚值,与位置i的元素交换;两个子序列区间是[iLow, i)和(i, iHigh].
Array[i] = Array[iHigh];
Array[iHigh] = iTemp;

完整的算法代码是:

void QuickSort3 (int Array[], int iLow, int iHigh)
{

if (iLow < iHigh)

{

int i = iLow;                               // 遍历指示器i,i左边的元素都比锚值小,右边的元素都比锚值大
int iVal = Array[iHigh];               // 锚值设定为最后一个元素,与上面两种方法不同,这个取决于遍历数组的方向,总在该方向末尾的元素
for (int j=iLow; j<iHigh; j++)       // 便利指示器j,用于遍历整个数组的元素,在遍历过程中,j >= i,等号只在开始遍历时成立
{

if (Array[j] <= iVal)        // 当j位置元素小于锚值时,两者交换(此时位置i的元素一定大于锚值),两个指示器均右移,此时区间 [i,j)的数值均大于锚值
{
int iTemp = Array[i];
Array[i] = Array[j];
Array[j] = iTemp;
i++;
}

}
int iTemp = Array[i];                  // 边界情况,当跳出循环,将Array[iHigh]存放的锚值,与位置i的元素交换;两个子序列区间是[iLow, i)和(i, iHigh].
Array[i] = Array[iHigh];
Array[iHigh] = iTemp;


} //if

}


快速排序,经典算法。当初上课的时候,应付考试,背下来就行了,就足够应付大部分考试。而后,面试的时候,基本上也是被下来就行,因为基本原理大家都清楚。但是,真正是否清楚了?我觉得,还是要把背下来的东西统统忘掉之后,再自己写一遍这个算法,才是真的清楚了其中的思想、细节。这样,心里才真正踏实,否则总有一种飘到空中的感觉,两脚不落地。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值