【C语言】_冒泡排序及其优化思路

目录

[1. 第一版代码:无忧化版](#1. 第一版代码:无忧化版)

[2. 第二版代码:添加逐趟判断有序的优化版](#2. 第二版代码:添加逐趟判断有序的优化版)


核心思想:两两相邻的元素进行比较

1. 第一版代码:无忧化版

cpp 复制代码
#include<stdio.h>
void bubble_sort(int* arr, int sz) {
	// 确定趟数: 
	// (对于目标升序的冒泡排序,一趟可实现待排序数中最大数被置于最后)
	// 第0趟结束,待排序数个数:9个,排好序数个数:1个;
	// 第1趟结束:待排序数个数:8个,排好序数个数:2个;
	// 第i趟结束:待排序数个数:sz-1-i个,排好序数个数:i+1个;
	// 对于sz个数,当i=sz-1时,完成所有数的排序,即需排sz-1趟
	int i = 0;
	for (int i = 0; i < sz - 1; i++) {
		// 1趟排序内
		int j = 0;
		// 确定1趟内比较次数:
		// 对于第0趟,待排序数个数:10个,需比较的数的对数:9对
		// 对于第1趟,待排序数个数: 9个,需比较的数的对数:8对
		// 对于第i趟,待排序数个数:sz-i个,需比较的数的对数:sz-1-i对
		for (j = 0; j < sz-1-i; j++) {
			if (arr[j] > arr[j + 1]) {
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
void Print(int* arr, int sz) {
	for (int i = 0; i < sz; i++) {
		printf("%d ", *(arr + i));
	}
}
int main() {
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	// 调用排序函数(升序)
	bubble_sort(arr,sz);
	// 调用打印函数
	Print(arr, sz);
	return 0;
}

运行结果如下:

2. 第二版代码:添加逐趟判断有序的优化版

第一版代码的测试排序数序列是原本降序,调用冒泡排序实现升序的极端情况;

而当待排序数列不至于极端,即接近目标有序情况时,第一版代码的排序会浪费大量时间与资源;

考虑优化:当某一趟排序过程未发生任何交换时,判定该序列已经有序

具体优化思路为:设置有序标志flag,在每一趟排序中先假设该序列已经有序(即将flag置1)。若在本趟排序中发生交换(即实际上该序列尚未有序),则将flag再次置0。在排序函数体末尾对flag进行判断,若flag==1则表示本趟未发生交换,终止后续无效的判断趟数

代码如下:

cpp 复制代码
#include<stdio.h>
void bubble_sort(int* arr, int sz) {
	// 确定趟数: 
	// (对于目标升序的冒泡排序,一趟可实现待排序数中最大数被置于最后)
	// 第0趟结束,待排序数个数:9个,排好序数个数:1个;
	// 第1趟结束:待排序数个数:8个,排好序数个数:2个;
	// 第i趟结束:待排序数个数:sz-1-i个,排好序数个数:i+1个;
	// 对于sz个数,当i=sz-1时,完成所有数的排序,即需排sz-1趟
	int i = 0;
	for (int i = 0; i < sz - 1; i++) {
		// 1趟排序内
		// 假设该序列已经有序:
		int flag = 1;
		int j = 0;
		// 确定1趟内比较次数:
		// 对于第0趟,待排序数个数:10个,需比较的数的对数:9对
		// 对于第1趟,待排序数个数: 9个,需比较的数的对数:8对
		// 对于第i趟,待排序数个数:sz-i个,需比较的数的对数:sz-1-i对
		for (j = 0; j < sz-1-i; j++) {
			if (arr[j] > arr[j + 1]) {
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				// 进入循环体发生交换<=>序列非有序,将标志重置为0:
				flag = 0;
			}
		}
		// 本趟未交换,则表示序列已经有序,终止后续趟数
		if (flag == 1) {
			break;
		}
	}
}
void Print(int* arr, int sz) {
	for (int i = 0; i < sz; i++) {
		printf("%d ", *(arr + i));
	}
}
int main() {
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	// 调用排序函数(升序)
	bubble_sort(arr,sz);
	// 调用打印函数
	Print(arr, sz);
	return 0;
}

运行结果如下:

相关推荐
今天吃饺子1 小时前
小创新模型!6种2024算法优化BiTCN-SVM单变量输入单步预测,MATLAB机器学习预测全家桶再更新...
人工智能·算法·机器学习·支持向量机·matlab
廖显东-ShirDon 讲编程2 小时前
《零基础Go语言算法实战》【题目 2-5】函数参数的值传递和引用传递
算法·程序员·go语言·web编程·go web
不玩return的马可乐2 小时前
LeetCode 747. 至少是其他数字两倍的最大数
数据结构·c++·程序人生·算法·leetcode
bgf_me3 小时前
代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
算法
怎么名字都重复3 小时前
1.两数之和--力扣
java·数据结构·算法·leetcode·软件工程
Odaily_3 小时前
SVM赛道概览:MoveVM落地,SVM能走多远
人工智能·算法·机器学习·支持向量机·数据挖掘
深图智能4 小时前
OpenCV的一种改进型的素描特效算法
图像处理·opencv·算法·计算机视觉
Mr.W.T4 小时前
负载均衡原理及算法
算法·负载均衡
KeyPan4 小时前
【机器学习:八、逻辑回归】
人工智能·算法·机器学习·数据挖掘·逻辑回归
yonuyeung4 小时前
代码随想录算法【Day16】
数据结构·算法·leetcode