基本算法-冒泡排序

简介: 基本算法-冒泡排序

前言

      本文介绍一种经典排序算法——冒泡排序,是入门级的排序算法之一。以下是本篇文章正文内容,包括算法简介、算法特点、算法实现和C++示例。

一、冒泡排序简介

      冒泡排序法又称为交换排序法,从第一个元素开始,比较相邻元素的大小,若大小有误,则对调后再进行下一个元素的比较,就像是气泡从水底一点点冒出一样。如此扫描一次可确保最后一个元素位于正确的顺序,接下来再进行第二次扫描,将次大的值放在倒数第二个位置,以此类推,直到完成所有元素的排序。

二、算法特点

      1)n个元素冒泡排序法最多执行n-1次扫描。最坏情况和平均情况需执行(n-1)+(n-2)+....+3+2+1=n(n-1)/2次,时间复杂度为O(n2);最好情况只需扫描一次即可,也就是本身已经排序好了,这样只执行了n-1次,时间复杂度为O(n)。


      2)由于冒泡为相邻两个数据相互比较而后决定是否互换位置,并不会改变原来排序的顺序,因此属于稳定排序法。


      3)只需要一个额外空间,空间复杂度很低。


      4)此排序法适用于数据量小或有部分数据已经排序过的情况。

三、代码实现

// 冒泡排序
vector<int> BubbleSort(vector<int> data)
{
  // 拷贝
  vector<int> result = data;
  // 排序过程:最多扫描n-1次,n为数据个数
  int size = static_cast<int>(data.size());
  for (int t = size - 1; t >= 0; --t)
  {
    // 若已排序好,扫描一遍后,flag应为false,此时可中断以达到提速效果
    bool flag = false;
    for (int i = 0; i < t; ++i)
    {
      if (result[i] > result[i + 1])
      {
        int temp = result[i];
        result[i] = result[i + 1];
        result[i + 1] = temp;
        flag = true;
      }
    }
    if (!flag)
      break;      
  }
  return result;
}

四、C++示例

#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
using namespace std;
// 展示当前顺序
void Show(vector<int> data)
{
  size_t size = data.size();
  for (size_t i = 0; i < size; ++i)
    cout << setw(4) << data[i];
  cout << endl;
}
// 冒泡排序
vector<int> BubbleSort(vector<int> data)
{
  // 拷贝
  vector<int> result = data;
  cout << "冒泡排序:\n原始数据:\n";
  Show(result);
  // 排序过程:最多扫描n-1次,n为数据个数
  int size = static_cast<int>(data.size());
  for (int t = size - 1; t >= 0; --t)
  {
    // 若已排序好,扫描一遍后,flag应为false,此时可中断以达到提速效果
    bool flag = false;
    for (int i = 0; i < t; ++i)
    {
      if (result[i] > result[i + 1])
      {
        int temp = result[i];
        result[i] = result[i + 1];
        result[i + 1] = temp;
        flag = true;
      }
    }
    if (!flag)
      break;
    cout << "第" << size - t << "次排序结果:\n";
    Show(result);
  }
  cout << "排序后结果:\n";
  Show(result);
  return result;
}
// 主函数
int main()
{
  vector<int> data = { 9,11,567,0,-2,4,2 };
  // 冒泡排序
  vector<int> result1 = BubbleSort(data);
  system("pause");
  return 0;
}

  效果图:

      综上所述,冒泡排序法是个比较基础的排序法,优点是便于理解和稳定,缺点就是挺慢的,工程上还是用别的算法吧~

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
2月前
|
搜索推荐
冒泡排序算法
【10月更文挑战第19天】冒泡排序是一种基础的排序算法,虽然在实际应用中可能不是最优的选择,但对于理解排序算法的基本原理和过程具有重要意义。
|
2月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
21 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
2月前
|
搜索推荐 算法 数据可视化
深入解析冒泡排序算法
深入解析冒泡排序算法
42 4
|
6月前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
2月前
|
搜索推荐 C语言
排序算法--冒泡排序
排序算法--冒泡排序
16 0
|
2月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
4月前
|
搜索推荐 Java
经典排序算法---冒泡排序
这篇文章详细介绍了冒泡排序算法的基本思想、比较轮数和次数,并提供了Java语言实现冒泡排序的代码示例,展示了如何通过相邻元素的比较和交换来达到排序的目的。
经典排序算法---冒泡排序
|
5月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
34 1
|
6月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**