快速排序平均时间复杂度是O(nlogn),最坏时间复杂度是O(n^2),空间复杂度是O(logn),是不稳定排序算法。
主要实现思想:通过分区,首先选取基节点,基节点满足左边数据小于基节点,右边数据大于基节点;当完成一趟分区后,取得中间值,对左边数据同样进行分区满足“基节点左小右大”性质,对右边同样进行分区满足“基节点左小右大”性质,一直递归,直到左边数据哨兵指针大于等于右边哨兵指针即为结束条件。
void Sorts::quick(vector<int>& nums, int left, int right)
{
if (left >= right)
return;
int middle = partition(nums, left, right);
quick(nums, left, middle - 1);
quick(nums, middle + 1, right);
}
下面是实现选择排序算法代码
Sorts.h
#pragma once
#include <iostream>
#include <vector>
using namespace std;
struct Sorts {
void quick(vector<int>& nums);
void print(vector<int>& nums);
private:
void quick(vector<int>& nums, int left, int right);
int partition(vector<int>& nums, int left, int right);
};
Sorts.cpp
#include "Sorts.h"
void Sorts::quick(vector<int>& nums)
{
quick(nums, 0, nums.size() - 1);
}
void Sorts::quick(vector<int>& nums, int left, int right)
{
if (left >= right)
return;
int middle = partition(nums, left, right);
quick(nums, left, middle - 1);
quick(nums, middle + 1, right);
}
int Sorts::partition(vector<int>& nums, int left, int right)
{
int i = rand() % (right - left + 1) + left; // 取随即基节点,排序效率最佳
swap(nums[i], nums[left]);
int pivot = nums[left]; // 取第一个基节点
int lSentry = left + 1;
int rSentry = right;
while (lSentry < rSentry) // 遍历整个数组
{
while (lSentry < rSentry && nums[lSentry] < pivot) // 找到第一个大于基准值下标,加上校验判断优化性能
++lSentry;
while (lSentry < rSentry && nums[rSentry] > pivot) // 找到第一个小于基准值下标,加上校验判断优化性能
--rSentry;
if (lSentry < rSentry)
{
swap(nums[lSentry], nums[rSentry]); //交换左右哨兵值
++lSentry;
--rSentry;
}
}
if (nums[rSentry] > pivot) // lSentry >= rSentry
--rSentry;
swap(nums[rSentry], nums[left]); // 中间集结点归属到左边部分
return rSentry; // 返回右边哨兵作为中间值
}
void Sorts::print(vector<int>& nums)
{
for (const auto& it : nums)
cout << it << ",";
cout << endl;
}
main.cpp
#include <vector>
#include "Sorts.h"
using namespace std;
int main()
{
vector<int> nums = { 2,0,1,6,8,10,5,99,87,333,2,0,1 };
Sorts sorts;
sorts.print(nums);
sorts.quick(nums);
sorts.print(nums);
return 1;
}