1.思想
设需要排序的数组下标p-r,选择p-r任意一个数据pivot(分区点),遍历p-r,将小于pivot的数据放左边,大于pivot的数据放右边,pivot放中间,进过这一步骤后,数组p-r,即被分为三个部分(p、q-1)小于pivot(q+1、r)大于pivot中间是pivot,根据分治、递归的思想,递归排序p-q-1、q+1-r的数据,直到区间缩小为1说明数据有序
图解:
递推公式、终止条件
递推公式:
q = partition(p...r)
quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1, r)
终止条件:
p >= r
代码实现:
分治递归过程
//快速排序
void quickSort(vector<int> & data)
{
int n = data.size();
quickSort(data, 0, n - 1);
}
void quickSort(vector<int> & data, int lo, int hi)
{
if (lo >= hi) return;
int q = partition(data,lo,hi);
quickSort(data, lo, q-1);
quickSort(data,q+1,hi);
}
和归并排序类似,想要实现快速排序关键是要实现分区函数partition()
实现思路图解
分区函数实现
//分区函数
int partition(vector<int>& data,int lo , int hi) {
int part = data[hi];
int i = lo;
for (int j = lo; j <= hi - 1; j++)
{
if (data[j] < part)
{
swap(data[i], data[j]);
i++;
}
}
swap(data[i],data[hi]);
return i;
}