【C++ | 排序算法】:冒泡排序

674 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

1、写在前面

大家好,今天记录的内容分别是两个交换排序:

  • 冒泡排序

2、内容

概念

冒泡排序(Bubble Sort,也称为起泡排序) 是一种比较简单的交换排序方法。它的基本思想是对所有相邻记录的关键字值进行比较,如果不满足排序要求(即逆序),则将其交换,最终直到所有记录排好序为止。

解释

冒泡排序是一种简单直观的排序算法,该算法会重复地扫描预排序的序列,每次都会比较两个元素,如果是逆序则交换这两个元素。就这样,越大(或越小)的元素会经过交换而慢慢“浮”到序列的顶端,因此该算法被称为冒泡排序。

步骤

  1. 从第一个元素开始,扫描序列,比较相邻的元素,如果第一个元素比第二个元素大,就交换;
  2. 在第一轮比较中,从前往后扫描序列,扫描结束后,末尾元素会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 如果有n个元素,则会进行n-1次扫描;
  5. 对于越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码

自定义函数,交换两个元素的值:

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

冒泡排序如下:

#include <iostream>
using namespace std;

template <class Type>
void BubbleSort(Type A[], int n) {
    // 有n个数据就进行 n-1 次循环
    for (int i = 1; i < n; ++i) {
        // 假设本趟排序没有发生过交换
        bool flag = false;
        // 一趟冒泡过程
        for (int j = 0; j < n-i; ++j) {
            if (A[j] > A[j+1]) {
                swap(A[j], A[j+1]);   // 如果前一个数据大于后一个数据,则交换
                flag = true;          // 标志这一趟冒泡有交换过
            }
        }
        // 如果本次扫描(遍历)没有发生过交换,则说明序列已经有序
        if(flag == false) return;
    }
}

int main() {
    int arr[5] = {20, 50, 40, 10, 30}; 
    BubbleSort(arr, 5);
    for(int i : arr) cout << " " << i;
    return 0;
}

3、写在最后

好了,文章的内容就到这里,感谢观看。