6-28 冒泡排序 (30 分)

本文介绍了如何使用C语言实现冒泡排序算法,包括函数`bubbleSort`的详细实现,该函数接收一个整数数组和其长度作为参数,进行升序排序。文章还提供了裁判测试程序样例,包括读取输入数据、调用排序函数以及打印排序结果的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程实现冒泡排序函数。void bubbleSort(int arr[], int n);。其中arr存放待排序的数据,n为数组长度(1≤n≤1000)。

函数接口定义如下:
/* 对长度为n的数组arr执行冒泡排序 */
void bubbleSort(int arr[], int n);
请实现bubbleSort函数,使排序后的数据从小到大排列。

裁判测试程序样例:
#include <stdio.h>

#define N 1000
int arr[N];

/* 对长度为n的数组arr执行冒泡排序 */
void bubbleSort(int arr[], int n);

/* 打印长度为n的数组arr */
void printArray(int arr[], int n);

void swap(int *xp, int *yp) {
int temp = *xp;
*xp = *yp;
*yp = temp;
}

int main() {
int n, i;
scanf("%d", &n);
for (i = 0; i < n; ++i) {
scanf("%d", &arr[i]);
}
bubbleSort(arr, n);
printArray(arr, n);
return 0;
}
/* 打印长度为n的数组arr /
void printArray(int arr[], int n) {
int i;
for (i = 0; i < n; i++) {<

### 冒泡排序算法实现及原理 冒泡排序是一种基础的交换排序算法,其核心思想是通过多次比较和交换,将未排序部的最大值逐步移动到序列的末尾[^1]。以下是冒泡排序的详细原理与实现。 #### 原理 冒泡排序的核心在于对相邻元素进行比较和交换。对于长度为 \( n \) 的数组,冒泡排序需要执行 \( n-1 \) 轮比较操作。在每一轮中,从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。经过每一轮操作后,当前未排序部的最大值会被移动到数组的末尾。 例如,给定数组 `[1, 2, 6, 4, 3, 7, 5]`,按照从小到大的顺序排序时,第一轮会将 `7` 移动到数组的末尾,第二轮会将 `6` 移动到倒数第二个位置,依此类推[^1]。 #### 实现 以下是冒泡排序的 Python 实现代码: ```python def bubble_sort(arr): n = len(arr) for i in range(n - 1): # 控制轮数 for j in range(n - 1 - i): # 控制每一轮的比较范围 if arr[j] > arr[j + 1]: # 如果前一个元素大于后一个元素 arr[j], arr[j + 1] = arr[j + 1], arr[j] # 交换位置 return arr ``` #### 示例 以下是对数组 `[1, 2, 6, 4, 3, 7, 5]` 进行冒泡排序的过程: 初始数组:`[1, 2, 6, 4, 3, 7, 5]` 第一轮:`[1, 2, 4, 3, 6, 5, 7]`(最大值 `7` 移动到最后) 第二轮:`[1, 2, 4, 3, 5, 6, 7]`(次大值 `6` 移动到倒数第二个位置) 第三轮:`[1, 2, 3, 4, 5, 6, 7]`(此时已完全有序) #### 时间复杂度与空间复杂度 - **时间复杂度**:最坏情况下(逆序数组),时间复杂度为 \( O(n^2) \),其中 \( n \) 是数组的长度。最佳情况下(已排序数组),时间复杂度为 \( O(n) \)[^1]。 - **空间复杂度**:冒泡排序是一种原地排序算法,空间复杂度为 \( O(1) \)[^1]。 #### 改进版 为了优化冒泡排序,可以在某一轮中如果没有发生任何交换,则提前结束排序过程。以下是改进后的实现: ```python def optimized_bubble_sort(arr): n = len(arr) for i in range(n - 1): swapped = False # 标记是否发生交换 for j in range(n - 1 - i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] swapped = True if not swapped: # 如果没有发生交换,提前结束 break return arr ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P-chanY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值