开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
1、写在前面
大家好,今天记录的内容分别是两个交换排序:
- 冒泡排序
2、内容
概念
冒泡排序(Bubble Sort,也称为起泡排序) 是一种比较简单的交换排序方法。它的基本思想是对所有相邻记录的关键字值进行比较,如果不满足排序要求(即逆序),则将其交换,最终直到所有记录排好序为止。
解释
冒泡排序是一种简单直观的排序算法,该算法会重复地扫描预排序的序列,每次都会比较两个元素,如果是逆序则交换这两个元素。就这样,越大(或越小)的元素会经过交换而慢慢“浮”到序列的顶端,因此该算法被称为冒泡排序。
步骤
- 从第一个元素开始,扫描序列,比较相邻的元素,如果第一个元素比第二个元素大,就交换;
- 在第一轮比较中,从前往后扫描序列,扫描结束后,末尾元素会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 如果有n个元素,则会进行n-1次扫描;
- 对于越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码
自定义函数,交换两个元素的值:
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、写在最后
好了,文章的内容就到这里,感谢观看。