快速排序(Quicksort)是一种常用的排序算法,它基于分治的思想。
时间复杂度:O(nlogn)
空间复杂度:O(logn)
快速排序的基本思想如下:
- 选择一个元素作为基准(pivot)。
- 将序列中比基准小的元素移到基准的左边,比基准大的元素移到基准的右边。这个过程称为划分(partition)。
- 对划分后的两个子序列(基准左边和右边的序列)递归地应用上述步骤,直到子序列的长度为1或0,也即序列已经有序。
- 合并所有子序列的结果,得到最终的排序序列。
代码参考这篇文章:
void Quick_Sort(int *arr, int begin, int end) {
if (begin > end) { //当待排序的子数组长度为0或负数时,终止递归
return;
}
int tmp = arr[begin]; //取数组的第一个元素arr[begin]作为基准元素
int i = begin;
int j = end;
while(i != j) { //指针i和j分别从数组的两端向中间移动,寻找可以交换的元素
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = tmp; //将基准元素放在最终位置
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}