void sorting() { int size; Serial.print("----------------------------------------------------------------------\n"); Serial.println("冒泡排序:"); //int n = sizeof(samples) / sizeof(samples[0]); // 计算数组长度 int* samples = (int*)malloc(size * sizeof(int)); for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - 1 - i; j++) { if (samples[j] > samples[j + 1]) { int swap = samples[j]; samples[j] = samples[j + 1]; samples[j + 1] = swap; } } } for (int i = 0; i < sampleIndex; i++) { if (i % 10 == 0 && i != 0) // 当i是10的倍数且不为0时执行 { Serial.println(); } Serial.print(samples[i]); Serial.print("; "); } Serial.println(); Serial.print("----------------------------------------------------------------------\n"); free(samples); }这段排序程序是否可以,并一起优化下程序。
时间: 2025-06-02 07:13:58 浏览: 13
### 冒泡排序的实现检查与优化
冒泡排序是一种简单的排序算法,其核心思想是通过重复遍历待排序的列表,比较相邻的元素并根据需要交换它们的位置,从而将较大的元素逐步“冒泡”到列表的一端。以下是基于 C++ 的冒泡排序实现及其优化版本。
#### 原始实现
以下是一个基本的冒泡排序实现:
```cpp
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) { // 外层循环控制遍历次数
for (int j = 0; j < n - i - 1; j++) { // 内层循环进行相邻元素比较
if (arr[j] > arr[j + 1]) { // 如果前一个元素大于后一个元素,则交换
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
```
#### 检查正确性
上述代码的逻辑是正确的,能够完成冒泡排序的基本功能。它通过双重循环实现了对数组的遍历和相邻元素的比较交换操作[^1]。然而,这种实现存在性能上的冗余,因为即使在某一轮遍历中没有发生任何交换,算法仍然会继续执行后续的循环。
#### 优化实现
为了提高效率,可以在内层循环中引入一个标志变量 `swapped`,用于记录是否发生了交换。如果某一轮遍历中没有发生任何交换,则可以提前终止算法。
```cpp
void optimizedBubbleSort(int arr[], int n) {
bool swapped; // 标志变量,记录是否发生交换
for (int i = 0; i < n - 1; i++) {
swapped = false; // 每轮开始时重置标志
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true; // 发生了交换
}
}
if (!swapped) break; // 如果没有发生交换,提前结束
}
}
```
#### 使用 `malloc` 动态分配内存
如果需要使用动态内存分配(例如 `malloc`),可以通过以下方式实现:
```cpp
#include <iostream>
using namespace std;
void bubbleSort(int* arr, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int n = 5;
int* arr = (int*)malloc(n * sizeof(int)); // 动态分配内存
if (arr == nullptr) {
cout << "Memory allocation failed!" << endl;
return -1;
}
// 初始化数组
arr[0] = 64; arr[1] = 34; arr[2] = 25; arr[3] = 12; arr[4] = 22;
// 打印原始数组
cout << "Original array: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 调用冒泡排序
bubbleSort(arr, n);
// 打印排序后的数组
cout << "Sorted array: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
free(arr); // 释放动态分配的内存
return 0;
}
```
#### Serial 打印(适用于嵌入式环境)
在嵌入式环境中,通常使用 `Serial.print` 或 `Serial.println` 进行调试输出。以下是修改后的代码示例:
```cpp
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
// 打印每轮排序后的结果
Serial.print("After pass ");
Serial.print(i + 1);
Serial.print(": ");
for (int k = 0; k < n; k++) {
Serial.print(arr[k]);
Serial.print(" ");
}
Serial.println();
}
}
```
#### 性能分析
冒泡排序的时间复杂度为 O(n²),其中 n 是数组的长度。虽然可以通过引入标志变量优化算法,减少不必要的循环次数,但其最坏情况下的时间复杂度仍然是 O(n²)[^1]。
###
阅读全文
相关推荐


















