- 快速排序输采用分而治之的策略,将一个串分为两个串,分别进行排序
- 具体实现方法:
- 在数组中找到基准pivot
- 分区partition操作:将所有小于pivot的元素放在pivot的前面,将所有大于pivot的元素放在pivot的后面
- 递归recursive操作:将两个子数组进行上面类似的排序
- 时间复杂度:最佳好情况O(nlogn),数组中的每个元素都需要被循环遍历一次,以找到其位置,需要O(n),而每次遍历时都将数组给分区成2个部分,需要O(logn);最坏情况O(n^2)
- 空间复杂度:最好情况O(logn),最坏情况O(n)
void partition(int *arr,int l, int h)
{
if (l >= h) return;
int i = l;
int j = h;
int key = arr[i];
while (i < j) {
while (i<j && (arr[j] > key)) j--;
if(i<j) arr[i++] = arr[j];
while (i<j && (arr[i] < key)) i++;
if(i<j) arr[j--] = arr[i];
}
arr[i] = key;
partition(arr, l, i-1);
partition(arr, i+1, h);
}