快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。以下为实现基本框架:
// 假设按照升序对array数组中[left, right)区间中的元素进行排序
void QuickSort(int array[], int left, int right)
{
if(right - left <= 1)
return;
// 按照基准值对array数组的 [left, right)区间中的元素进行划分
int div = partion(array, left, right);
// 划分成功后以div为边界形成了左右两部分 [left, div) 和 [div+1, right)
// 递归排[left, div)
QuickSort(array, left, div);
// 递归排[div+1, right)
QuickSort(array, div+1, right);
}
下面是具体代码:
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void QuickSort(int* a, int front, int end)
{
if (front == end)
{
return;
}
assert(a != NULL);
int key = front;
int left = front;
int right = end;
while (left < right)
{
// 右边找小
while (a[key] <= a[right]
&& right > left)
{
right--;
}
// 左边找大
while (a[key] >= a[left]
&& right > left)
{
left++;
}
if (left == right)
{
swap(&a[key], &a[left]);
break;
}
swap(&a[left], &a[right]);
}
if (front <= left - 1)
{
QuickSort(a, front, left - 1);
}
if (end >= right + 1)
{
QuickSort(a, right + 1, end);
}
}