【十大排序】冒泡排序

本文详细介绍了冒泡排序算法的工作原理,包括其升序排列的过程和逐步优化的步骤。通过实例展示了冒泡排序如何将无序数组转化为有序序列,并提供了相应的C++代码实现。此外,还包含了冒泡排序的伪代码,便于理解和应用。
摘要由CSDN通过智能技术生成

冒泡排序也叫起泡排序,顾名思义,就是将目标元素像水中的泡泡一样升到(升序排列)对应的位置。可以说是所有排序算法中最简单、最易实现的算法了。

算法思路

对 n 个数据进行排序,从待排序序列中找出一个最大值(升序排列)或最小值(降序排列),然后放到序列末尾,这样的操作执行 n-1 次,最终就可以得到一个有序序列。

算法过程

1、从数组开头比较相邻的两个元素。如果第一个比第二个大,就交换它们两个;

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

3、对数组中所有的元素重复以上步骤,末尾已经处理过的元素不需要再操作。

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

例如数组[14, 5, 86, 22, 6, 54, 30, 54, 29]:

1、从数组开头进行相邻元素的比较,比较14,5,交换它们的位置[5, 14, 86, 22, 6, 54, 30, 54, 29],......,直到最后,数组中的最大值86像泡泡一样“浮到”数组末尾[5, 14, 22, 6, 54, 30, 54, 29, 86];

2、对剩余元素[5, 14, 22, 6, 54, 30, 54, 29]进行排列,找到最大值54,“浮到”数组倒数第二个位置,得到数组[5, 14, 6, 22, 30, 54, 29, 54, 86];

3、重复上述步骤,直到所有元素都被处理,得到最终的有序序列[5, 6, 14, 22, 29, 30, 54, 54, 86]。

代码实现

伪代码

BubbleSort(array):                         
    for i from 0 to array.size() - 1{          // n个元素需遍历 n-1 次
        for j from 0 to array.size() - 1 - i{  // 
            if array[j] > array[j+1]{          // 若进行降序排序,则改成 < 小于号
                 swap(array[j] , array[j+1]);  // 交换 2 个相邻元素的位置
            }
        }
    }                                          
    return array;                                // 返回排好序的序列

c++代码函数实现

//冒泡排序
void BubbleSort(vector<int>& arr) {
	for(int i = 0; i < arr.size() - 1; i++) {
		for (int j = 0; j < arr.size() - 1 - i; j++) {
			if (arr[j] > arr[j + 1]) {
				int tem = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = tem;
			}
		}
	}
}

测试

#include <bits/stdc++.h>
using namespace std;

void BubbleSort(vector<int>& arr) {
	for(int i = 0; i < arr.size() - 1; i++) {
		for (int j = 0; j < arr.size() - 1 - i; j++) {
			if (arr[j] > arr[j + 1]) {
				int tem = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = tem;
			}
		}
	}
}
int main() {
	vector<int> arr{ 14, 5, 86, 22, 6, 54, 30, 54, 29};

	cout << "before sort: " << endl;
	for (auto a : arr) {
		cout << a << "\t";
	}
	cout << endl;

	BubbleSort(arr);

	cout << "after sort: " << endl;
	for (auto a : arr) {
		cout << a << "\t";
	}
	cout << endl;


	system("pause");
	return 0;
}

输出

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值