冒泡排序

作者: 老韩 分类: 信奥赛,算法 发布时间: 2024-05-03 19:04

在 信奥基础之初识算法 这篇文章中我们给出了一个冒泡排序的代码示例,

冒泡排序是最基础最好理解的一个排序算法。

既然叫冒泡排序,那我们首先得搞清楚这个冒泡的泡从哪儿来?

先看一张网络上搞来的图片:

上面的图是将一个一维数组通过冒泡排序的方式进行排序的过程(来自网络)。

​用文字来说明一下(两两比较,大的放后面):

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序比较简单,看完上面的过程应该大部分​同学都能理解。

在这里顺便提下排序算法的稳定性。

我们讲某一个排序算法是否稳定,可以简单理解为这个算法​排序后的数据是否唯一,这个唯一并不是说  {3,2,4,4,5} 排序后的结果一直是 {2,3,4,4,5}​就行, 而是说排序后的结果中红色的4和蓝色的4​的位置不能变

另外,我们一般用复杂度来评价​一个算法的好坏。这个等我们的C++基础讲完了再统一聊。代码仍然放下面,这次​我加上了注释。具体的代码讲解也得等C++基础全部​聊完后。

#include <iostream>
using namespace std;

/**
* 定义一个冒泡排序的函数,传入数组的数组的长度
**/
void bubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++) // 循环外层从第一位开始,控制比较次数
    {
        for (int j = 0; j < n - i - 1; j++)  // 循环内层从第一位开始
        {
            if (arr[j] > arr[j + 1])  // 每两个进行比较
            {
                swap(arr[j], arr[j + 1]);   // 交换作比较的数组两个位置的值,这里调用的swap是C++提供的函数
            }
        }
    }
}
int main()
{
    int arr[] = {64, 34, 25, 12, 22, 11, 90};  // 要排序的一维数组
    int n = sizeof(arr) / sizeof(arr[0]);  // 获取数组的长度,sizeof用来获取当前对象在内存中占用的大小
    cout << "排序前的数组为: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    bubbleSort(arr, n);   // 调用排序函数
    cout << "\n 排序后的数组为: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据