基本原理
- 选定一个基准数。
- 使用两个指针分别从两边开始遍历(先从左还是先从右遍历与基准数选取有关)。
- 从左向右走的指针如果遇到了比基准数小的数,继续右移;如果比基准数大,将其填入右指针所指的区域,然后开始移动右指针。
- 从右向左走的指针则相反。
- 当两个指针相遇,将基准数填入此时左右指针所指的区域。
- 此时基准数左所有的数都小于基准数,基准数右所有的数都大于基准数。
- 将基准数左和右分为两部分,利用递归对它们重复上列操作。
以最左或最右的数做基准数
若以最左的数做基准数时,先从右向左遍历。 若以最右的数做基准数时,先从左向右遍历。
void Sort(int *nums, int left, int right)
{
int l = left;
int r = right;
int key = nums[l]; //以最左的数做基准数
if (l >= r)
{
return; //如果只有一个元素,则返回
}
else
{
while (l < r)
{
while (r > l && nums[r] > key) //从右向左遍历
{
r--;
}
nums[l] = nums[r]; //将比基准数大的数放到右边
while (l < r && nums[l] < key) //从左向右遍历
{
l++;
}
nums[r] = nums[l]; //将比基准数小的数放到左边
}
nums[r] = key; //填入基准数
}
Sort(nums, left, r - 1);
Sort(nums, r + 1, right);
}