今天看到一种清爽的快速算法,复习一下~
快速排序算法的平均时间复杂度是O(n log n),最坏情况下的时间复杂度是O(n^2)。
快速排序的最佳情况是每次分割都平均分配元素,这种情况下时间复杂度可降至O(n log n)。
快速排序的基本步骤如下:
1、选择一个"基准"元素。可以选择第一个元素、最后一个元素、中间元素,或者随机选择一个元素作为基准。
2、重新排列数组。把所有比基准小的元素放在基准前面,所有比基准大的元素放在基准的后面。
3、递归把小于基准元素的子数组和大于基准元素的子数组进行快速排序。
贴代码:
cpp
**// Test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <vector>
using namespace std;
vector<int> QuickSort(vector<int>& arr)
{
// 如果数组长度小于等于1,直接返回
if (arr.size() <= 1)
{
return arr;
}
int mid = arr[arr.size() / 2]; // 选择中间元素作为基准
vector<int> left; // 存小于基准的元素
vector<int> middle; // 存等于基准的元素
vector<int> right; // 存大于基准的元素
for (const auto& it: arr)
{
if (it == mid)
{
middle.push_back(it); // 等于基准的元素放入 middle
}
else if (it < mid)
{
left.push_back(it); // 小于基准的元素放入 left
}
else if (it > mid)
{
right.push_back(it); // 大于基准的元素放入 right
}
}
// 递归排序 left 和 right,并将结果合并
vector<int> sortedLeft = QuickSort(left);
vector<int> sortedRight = QuickSort(right);
// 合并结果
vector<int> result;
result.insert(result.end(), sortedLeft.begin(), sortedLeft.end());
result.insert(result.end(), middle.begin(), middle.end());
result.insert(result.end(), sortedRight.begin(), sortedRight.end());
return result;
}
int main()
{
vector<int> arr = { 2,5,8,9,0,7,6,1,3,4 };
auto result = QuickSort(arr);
for (const auto& it : result)
{
cout << it << "\t";
}
cin.get();
return 0;
}
**
测试: