冒泡排序

91 阅读2分钟

给定待排序数组

数组中的元素:4 2 8 0 5 7 1 3 9

算法步骤:

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

2.对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值

3.重复以上的步骤,每次比较次数-1,直到不需要比较。

补充:

实现交换的方式,先将第一个元素进行保存,随后将第二个数覆盖到第一个数的位置,然后再将第第一个数放到第二个数的位置。

image.png

image.png

image.png

排序轮数

初始状态:4 2 8 0 5 7 1 3 9

对比次数:8次

第一轮交换完成:

image.png 可以看到9这个数字出现在了最底层,最大的数字已经找到。

第二轮交换完成:

image.png 对比次数:7次

第三轮交换完成:

image.png 对比次数:6次

第四轮交换完成:

image.png 对比次数:5次

以此类推最终排序结果: 0 1 2 3 4 5 6 7 8 9

image.png

排序的总轮数=元素的个数-1

每轮对比的次数=元素个数-排序轮数-1

代码实现:

#include <iostream>
using namespace std;

//利用冒泡排序实现升序序列
int main() {
	
	int arr[9] = { 4,2,8,0,5,7,1,3,9 };

	cout << "排序前:" << endl;
	for (int i = 0; i < 9; i++) {
		cout << arr[i] << " ";
	}
		cout << endl;

	//开始冒泡排序

	//总共排序轮数=元素个数-1
	for (int i = 1; i < 9 - 1; i++) {
		//内层循环对比,次数=元素个数 - 当前轮数 - 1
		for (int j = 0; j < 9 - i - 1; j++) {
			//如果第一个数字比第二个数字大,交换这两个数字
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

	//排序后结果
	cout << "排序后:" << endl;
	for (int i = 0; i < 9; i++) {
		cout << arr[i] << " ";
	}
	    cout << endl;

	return 0;
}

注意内层循环和外层循环的次数。