快速排序算法(C++版)

这篇具有很好参考价值的文章主要介绍了快速排序算法(C++版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、什么是快速排序

快速排序(Quick Sort)是一种常用的高效排序算法,属于分治法的典型代表。它的基本思想是选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素小于基准,另一部分的所有元素大于基准,然后对这两部分分别递归地进行排序。因为排序是在原有数据上进行的,所以属于"原地排序"。

2、快速排序的基本步骤:

  1. 选择基准元素:从数组中选择一个元素作为基准,通常选择最后一个元素。

  2. 划分阶段:重新排列数组,将小于基准的元素放在基准的左侧,大于基准的元素放在基准的右侧。基准元素的最终位置称为分区点。

  3. 递归排序:对划分得到的两个子数组分别递归地进行快速排序。

  4. 合并阶段:不需要合并步骤,因为排序是原地进行的。

3、快速排序的适用范围和特点:

适用范围

  • 快速排序适用于大规模数据集的排序,尤其是对于数组或列表等数据结构的排序。
  • 由于其平均时间复杂度为O(n log n),在大多数情况下,它比其他O(n log n)的排序算法更快。

特点

  1. 高效性:在平均情况下,快速排序的性能非常好,其平均时间复杂度为O(n log n)。这比许多其他排序算法都要快。

  2. 原地排序:快速排序是一种原地排序算法,不需要额外的内存空间。

  3. 不稳定性:在排序的过程中,元素的相对位置可能会发生改变,所以快速排序是一种不稳定的排序算法。

  4. 适应性:快速排序在处理部分有序的数据时性能也很好,而且在实际应用中,大多数数据都是部分有序的。

  5. 递归实现:算法使用递归来分治和解决问题,这使得实现相对简单,但也可能导致在数据规模较大时的堆栈溢出问题。

尽管快速排序有上述优点,但在最坏情况下,即基准元素的选择不当时,时间复杂度可能达到O(n^2),这是其主要缺点之一。在实际应用中,通常通过优化基准元素的选择、随机化等方法来降低最坏情况的出现概率。

4、C++版的快速排序示例

#include <iostream>
#include <vector>

// 交换数组中两个元素的位置
void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

// 在数组中选择一个基准元素,并将数组划分成两个部分,左边小于基准,右边大于基准
int partition(std::vector<int> &arr, int low, int high) {
    int pivot = arr[high]; // 选择最后一个元素作为基准
    int i = low - 1;

    for (int j = low; j <= high - 1; ++j) {
        if (arr[j] < pivot) {
            ++i;
            swap(arr[i], arr[j]);
        }
    }

    swap(arr[i + 1], arr[high]);
    return i + 1;
}

// 快速排序递归函数
void quickSort(std::vector<int> &arr, int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high); // 获取基准元素的正确位置

        // 对基准元素左右两侧分别进行递归排序
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}

// 打印数组元素
void printArray(const std::vector<int> &arr) {
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    int n = arr.size();

    std::cout << "Unsorted array: ";
    printArray(arr);

    quickSort(arr, 0, n - 1);

    std::cout << "Sorted array: ";
    printArray(arr);

    return 0;
}

这个程序中,quickSort 函数是递归进行快速排序的主要函数,而 partition 函数用于在数组中选择基准元素并划分数组。最后,通过 swap 函数来交换数组中两个元素的位置。文章来源地址https://www.toymoban.com/news/detail-754145.html

到了这里,关于快速排序算法(C++版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法基础15 —— 分治算法(归并排序 + 快速排序)

    分治法的基本概念、思想 分治法是一种很重要的算法。 字面解释,分治分治,分而治之。就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 不难发现,分

    2024年02月03日
    浏览(38)
  • 【C++实现插入排序、希尔排序、冒泡排序、快速排序、选择排序】

    使用C++实现来插入排序、希尔排序、冒泡排序、快速排序、选择排序算法。 插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而生成一个新

    2024年02月06日
    浏览(36)
  • 排序算法1:冒泡排序、快速排序、插入排序

    排序算法:交换类排序,插入类排序、选择类排序、归并类排序 交换类排序:冒泡排序、快速排序 一、冒泡排序  时间复杂度:内层是ji,外层是从0到n-1,运行的总次数是1+2+3+4+...+n-1,即O() 空间复杂度:O(1),没有使用额外空间,不会因为n的变化而变化 如果数组本身有序,最

    2024年02月21日
    浏览(34)
  • 【排序算法(三)】交换排序(冒泡排序&&快速排序)

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【排序算法(二)】选择排序(直接选择排序堆排序) 冒泡排序属于交换排序,所谓 交换排序 就是就是根据序列中两个记录

    2023年04月22日
    浏览(34)
  • 【算法】排序——选择排序和交换排序(快速排序)

     ========================================================================= 主页点击直达: 个人主页 我的小仓库: 代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏  =========================

    2024年02月08日
    浏览(34)
  • 【算法系列 | 5】深入解析排序算法之——快速排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月08日
    浏览(37)
  • 排序算法二 归并排序和快速排序

    目录 归并排序 快速排序 1 挖坑法​编辑 2 Hoare法 快排的优化 快排的非递归方法 七大排序算法复杂度及稳定性分析 归并排序是建立在归并操作上的一种有效的排序算法,将以有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,在使子序列段间有序.若将两个有序的

    2024年02月07日
    浏览(32)
  • 深度理解排序算法——快速排序

    在如今所知的众多排序算法中,快速排序无疑是脱颖而出的一种高效排序算法,在众多的情景下快速排序的算法效率都是数一数二的。闲话少叙,直接开始讲解快速排序的本质。 霍尔版本作为快速排序的最初版本,其他的版本都在霍尔版本的基础上衍生出来,因此掌握好霍尔

    2024年02月03日
    浏览(29)
  • 排序算法笔记-快速排序

    快速排序:确定分界数,左边小于分界,右边大于分界数,通过递归来不断重置分界数划分区域,直至完成排序 最优 n*logn 最差 n^2 原地排序,所以空间复杂度是 O(1) 细节不在阐述,自己理解一下 力扣912. 排序数组 套用模版,完美解决 力扣215 数组中的第K个最大元素 题中要求

    2024年02月16日
    浏览(35)
  • 快速排序-排序算法

    算法思想 快速排序采用的仍然是 分治 的思想。 Step1.每次在无序的序列中选取一个基准数。 Step2.然后将大于和小于基准数的元素分别放置于基准数两边。(前面部分的元素均小于或等于基准数,后面部分均大于或等于基准数) Step3.然后采用分治法(递归)分别对两侧部分重

    2024年01月25日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包