什么是快速排序
关键词: 交替填充 或 换位
时间复杂度: O(log2n)
快速排序算法
思路
对于一个排好序的数组,我们假设为从小到大排序。
那么对于这个数组而言,其中的每一个元素,左边都是比它小的元素;
右边都是比它大的元素(若大小相等,在左边或右边都可以)。
所以我们进行排序,可以反过来想,即将每一个元素都放到它应该在的位置。
当放完所有的元素后,排序完成。
做法
那么我们要做的就是一个一个的找到元素所在的位置,并放好他们。
所以我们假设第一个元素为待放置元素。
通过以下的方式将其放置好,之后再递归的将其左边和右边再次进行排序即可。
图解Partition函数(例子)
写法1
将 partition 与 sort 函数写在一个函数里。
函数参数 : nums(需要排序的数组),startIndex(起始元素的下标),endIndex(最后一个元素的下标 + 1)
返回值: void
单层逻辑:先移动 R 指针,若遇到小于基准的值,则进行放置,接着换移动 L 指针。
结束条件: startIndex 与 endIndex 相交或 startIndex > endIndex
void quicksort1(vector<int> &nums, int startIndex, int endIndex)
{
if (!(startIndex < endIndex))
return;
int left = startIndex, right = endIndex - 1;
int temp = nums[left];
while (right > left)
{
while (right > left)
{
if (nums[right] < temp)
{
nums[left] = nums[right];
left++;
break;
}
right--; // nums[right] > temp
}
while (right > left)
{
if (nums