C++ 快排算法

今天看到一种清爽的快速算法,复习一下~

快速排序算法的平均时间复杂度是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;
}

**

测试:

相关推荐
皮卡狮7 分钟前
C++面向对象编程的三大核心特性之一:多态
开发语言·c++
Hello.Reader11 分钟前
深入浅出 Adam 优化算法从直觉到公式
深度学习·算法
识君啊11 分钟前
拆分与合并的艺术·分治思想:Java归并排序深度解析
java·数据结构·算法·排序算法·归并排序·分治
Trouvaille ~13 分钟前
【贪心算法】专题(六):降维打击与错位重构的终极收官
c++·算法·leetcode·面试·贪心算法·重构·蓝桥杯
2301_8008951013 分钟前
dijkstra求最短路径--备考蓝桥杯版
算法
葡萄98916 分钟前
蓝桥杯k倍区间(前缀和、余数统计)
数据结构·算法
智者知已应修善业18 分钟前
【任何一个自然数m的立方均可写成m个连续奇数之和】2024-10-17
c语言·数据结构·c++·经验分享·笔记·算法
YYYing.20 分钟前
【Linux/C++多线程篇(二) 】给线程装上“红绿灯”:通俗易懂的同步互斥机制讲解 & C++ 11下的多线程
linux·c语言·c++·经验分享·ubuntu
阿里嘎多哈基米28 分钟前
速通Hot100-Day07——栈
数据结构·算法·leetcode··队列·hot100
一叶落43828 分钟前
LeetCode 135. 分发糖果(C语言)| 贪心算法 + 双向遍历详解
c语言·数据结构·算法·leetcode·贪心算法·哈希算法