快速排序的思路十分简单,只有三步曲:
1.确定临界值
2.调整区间
3.递归处理数组的左段和右段
最关键的是第二步,如何调整区间,即把大于x的数放在x的左边,把小于x的数放在x的左边。
比较容易想到的方法是用两个数组,将大于x的数放在一个数组中,小于x的数放在另一个数组中。
还有一种方法是双指针。
待排数组为num[]
i指向left-1
j指向right+1
当num[i]<x时 i++
当num[j]>x时 j–
当num[i]>=x时 i指针不变
当num[j]<=x时 j指针不变
当(i<j)时,交换i和j指针指向的值
代码如下
void quick_sort(int num[], int left, int right)
{
if (left>= right) return;
int i = left - 1, j = right + 1, x = q[left + right >> 1]//1.这里取的临界值为中点;
while (i < j)//2.这里双指针法
{
do i ++ ; while (num[i] < x);
do j -- ; while (num[j] > x);
if (i < j) swap(num[i], num[j]);
}
//3.递归处理
quick_sort(num, left, j), quick_sort(num, j + 1, right);
}
最后,在算法的学习过程中,这些常见的算法需要非常熟悉。学习算法的过程是学习算法的思想,做到举一反三,不是死记硬背。