【排序算法详细介绍】桶排序(Bucket Sort)冒泡排序(Bubble Sort)快速排序(Quick Sort)

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


前言

今天学习了一些简单的排序算法,其实在我们平时解决问题中经常用到,今天正好一起看了看,记录一下。如果对你也有帮助,我很开心~


一、桶排序(Bucket Sort)

桶排序是一种排序算法,它将数组划分为一些有序的桶,然后每个桶再分别排序。最后,将所有的桶合并起来,得到一个有序的数组。桶排序的核心思想是将数据分散到不同的桶中,每个桶内部进行排序,最后将所有桶的数据合并

思路:

  1. 确定桶的数量,并创建这些桶
  2. 遍历原始数组,将每个元素放入相应的桶中
  3. 对每个桶内部进行排序。可以使用其他排序算法,或者递归地使用桶排序
  4. 将所有桶的元素按顺序合并成最终的有序数组

适用于数据分布比较均匀的情况,因为如果每个桶的大小相对一致,就减少了在桶内进行排序的工作量,时间复杂度桶的数量每个桶内采用的内部排序算法相关

小唐有话说:我感觉桶排序也是拿空间换时间的感觉,和哈希表有点像有没有!!!但是他们的主要的区别在于桶排序是一种排序算法,重于对元素的排序,而哈希表是一种数据结构,用于快速查找和插入

// 桶排序函数
void bucketSort(vector<float>& arr) {
    // 找到最大值和最小值
    //*max_element,*min_element是 C++ 标准库 <algorithm> 头文件中的函数,分别用于找到范围内的最大值和最小值。
    float max_val = *max_element(arr.begin(), arr.end());
    float min_val = *min_element(arr.begin(), arr.end());
    int bucket_count = 10; // 这里假设使用 10 个桶
    vector<vector<float>> buckets(bucket_count);// 创建桶
    // 将元素放入桶中
    for (float num : arr) {//是 C++11 引入的一种基于范围的 for 循环语法,也称为范围-based for循环
        //表示遍历浮点数数组 arr 中的每个元素,并将每个元素赋值给变量 num,然后执行循环体内的操作。
        int index = int(bucket_count * (num - min_val) / (max_val - min_val));
        buckets[index].push_back(num);
    }
    // 对每个桶内部进行排序,这里使用标准库的排序函数
    for (auto& bucket : buckets) {
        sort(bucket.begin(), bucket.end());
    }
    // 将所有桶的元素合并
    arr.clear();
    for (const auto& bucket : buckets) {
        arr.insert(arr.end(), bucket.begin(), bucket.end());
    }
}

对于此处的例子,时间复杂度: O(n + 10 * log(10)),其中10是是因为分了10个桶,分桶的过程时间复杂度是 O(n),std::sort是一种改进的快速排序算法,它的平均时间复杂度是O(n log n)

二、冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,其基本思想是通过不断地交换相邻元素,将较大的元素逐渐移到右侧(或较小的元素逐渐移到左侧),从而达到排序的目的
小唐有话说:不知道大家有没有印象!反正小唐印象超级无敌深刻,大一学C语音的时候就对它印象深刻,到现在仍然记忆尤新,当初看了好多好多遍才弄懂的算法,现在看简直简单的不能再简单,这就是轻舟已过万重山叭!

思路:

  1. 从第一个元素开始,依次比较相邻的两个元素
  2. 如果发现顺序不对(即当前元素大于下一个元素),则交换这两个元素的位置
  3. 继续进行相邻元素的比较和交换,直到整个序列变得有序
  4. 重复上述步骤,每次都会确定一个最大(或最小)元素的位置,直到整个序列有序为止

冒泡排序的时间复杂度为 O(n^2),因为时间复杂度较高,在实际应用中较少使用,特别是对于大规模数据集。

// 冒泡排序函数
void bubbleSort(vector<int>& arr) {
    int n = arr.size();

    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < n - i - 1; ++j) { //这里注意,内层循环只用到n-i-1,因为后面的已经排过啦
            // 如果当前元素大于下一个元素,则交换它们
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

二、快速排序(Quick Sort)

快速排序是一种高效的排序算法,属于比较排序的一类。它基于分治法的思想,通过选择一个基准元素,将数组分成两个子数组,使得左边的元素都小于基准元素右边的元素都大于基准元素,然后对这两个子数组分别递归地应用相同的排序算法。

思路:

  1. 选择一个基准元素(通常是数组中间的元素)
  2. 将数组分成两个子数组,左边的元素小于等于基准元素,右边的元素大于等于基准元素
  3. 对左右子数组分别递归地应用快速排序
  4. 合并排序好的左右子数组
// 快速排序函数
void quickSort(vector<int>& arr, int low, int high) {
    if (low < high) {

        int pivot = arr[high];// 选择最右边的元素作为基准元素
        int i = low - 1;
        cout << i << endl;

        // 将小于等于基准元素的元素移动到左边
        for (int j = low; j < high; ++j) {
            if (arr[j] <= pivot) {
                ++i;
                swap(arr[i], arr[j]);
            }
        }

        // 将基准元素移动到正确的位置
        swap(arr[i + 1], arr[high]);
        int pivotIndex = i + 1;

        // 递归排序左右子数组
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}

快速排序的平均时间复杂度为O(n log n)最差时间复杂度是 O(n^2),发生在数组已经有序或近乎有序的情况下。

写了快速排序的话就顺便在这最后介绍一下std::sort
std::sort 是 C++ 标准库提供的排序函数,其实现通常基于一种改进的快速排序算法(introsort)
相同点:
1.平均时间复杂度都为 O(n log n)
2.两者都基于分治法的思想,通过递归地划分数组并排序子数组来完成排序。
不同点:
1.std::sort 的具体实现可能会结合多种排序算法,而不仅仅是快速排序。标准库通常会选择在给定情况下最适合的排序算法,这可能包括快速排序、堆排序、插入排序等。
2.std::sort 通常是稳定排序的,即相等元素的相对顺序在排序后保持不变。而经典的快速排序算法是不稳定的,尽管可以通过一些改进策略使其成为稳定排序。
3.适应性: std::sort 可能会根据输入数据的性质在不同情况下选择不同的排序算法,以提高性能。这种自适应性是标准库排序函数的一个特点。
小唐有话说:总得来说官方给的就是比我们自己写的厉害👍!没要求自己写,咱们平时就还是用官方的叭!当然原理还是得掌握的!


总结

以上就是今天总结的内容,一些简单的排序算法,主要具体的还是根据题目随机应变,后续也会继续记录学习的一些算法呀,唐怡佳继续加油!文章来源地址https://www.toymoban.com/news/detail-824498.html

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

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

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

相关文章

  • 十大排序算法之冒泡排序、快速排序的介绍

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 说起来冒泡排序,是我们接触到的最早的一个排序算法了,这次就当进行一个巩固提升了。冒泡排序还被称为 交换排序 。 冒泡排序: 它重

    2024年02月07日
    浏览(29)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序,堆排序】超详细~~

    目录 冒泡排序(BubbleSort): 代码详解:  冒泡排序的优化:  选择排序(SelectSort): 代码详解:  插入排序(InsertSort): 代码详解:  希尔排序(ShellSort):  法一(交换法)代码详解:  法二(移位法--插入排序的优化)代码详解: 快速排序(QuickSort):  代码详解:  归并排

    2024年02月20日
    浏览(34)
  • 算法 - 快速排序(Quick_sort)

    目录 什么是快速排序? 快速排序的使用场景: 演示快速排序的过程: 第一趟排序: 第二趟排序: 通过代码来实现:  对快速排序的总结: 在写快速排序的代码之前,我们先对快速排序的排序原理以及定义进行梳理: 快速排序(Quick_sort)是对冒泡排序的一种改进,它也是

    2024年02月10日
    浏览(32)
  • 排序算法大全:冒泡排序【含优化】,选择排序【含优化】,直接插入排序,希尔排序,堆排序,快速排序【含3种实现版本及非递归实现】,归并排序【含非递归实现】。详细图解,文字解释,代码实现,性能分析。

    目录  一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析   三、直接插入排序 1、直接插入排序思想 2、直接插入排序算法的性能分析 四、希尔排序 1、希尔排序思想 2、希尔排序算法的性能分析 五、堆排

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

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

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

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

    2023年04月22日
    浏览(31)
  • python算法 之 快速排序(Quick Sort)

    时间复杂度 名称 示例算法 O(1) 常数时间复杂度 哈希表查找 O(logn) 对数时间复杂度 二分查找 O(n) 线性时间复杂度 遍历数组 O(nlogn) 线性对数时间复杂度 快速排序 O(n^2) 平方时间复杂度 冒泡排序、插入排序 O(n^3) 立方时间复杂度 矩阵乘法 O(2^n) 指数时间复杂度 穷举搜索 O(n!) 阶

    2024年02月04日
    浏览(28)
  • 图解快排——快速排序算法(quick sort)

    算法思想 快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。 快速排序的基本思想: 通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对

    2024年01月16日
    浏览(27)
  • 排序算法乱炖: 快速排序、归并排序、冒泡排序

    1. 快速排序原地版 最好情况的时间复杂度 :O(nlogn),logn为递归的层数,n为每层递归中总的时间复杂度。 最差情况的时间复杂度 :O(n*n) 2. 快速排序空间换时间版 最好情况的时间复杂度 :低于O(nlogn) 思想 :分治。分而治之 ,递归的把数据一分为二,直到数组中只有一个元素

    2024年02月11日
    浏览(35)
  • 【交换排序】手撕八大排序之快速排序和冒泡排序(超级详细)

    目录 🍁一.快速排序 🍀Ⅰ.Hoare法 🍇Ⅱ.挖坑法  🍋1.递归版本 🍊2.关于时间复杂度 🍎3.快速排序的优化之三数取中法 🍌4.非递归版本(使用栈实现) 🍐5.非递归的挖坑大法的全部代码 🍑二.冒泡排序(设置flag值)  🍁1.从前往后冒 🏵️2.从后往前冒 快速排序: 英国计算

    2024年02月12日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包