6-4 冒泡排序 (15分)

本文介绍了一种使用冒泡排序算法对整数数组进行排序的方法。通过比较相邻元素并交换位置,实现数组从小到大的排序。文章提供了具体的C语言代码实现,包括函数bubble的定义与调用。

输入n(1<=n<=10)个整数,将它们从小到大排序后输出,要求编写函数bubble()实现冒泡排序算法。

函数接口定义:
void bubble (int a[ ], int n);
其中 a为数组,n为数据个数。

裁判测试程序样例:

#include <stdio.h>
void bubble (int a[ ], int n);
int main(void)
{    
  int n, a[10];
	int i;
	scanf("%d", &n);
	for (i=0; i<n;i++)
		scanf("%d",&a[i]);
	bubble(a,n);
	for (i=0; i<n; i++)
		printf("%d ",a[i]);
  printf("\n");
	return 0;
}

/* 请在这里填写答案 */
输入样例:

8
7 3 66 3 -5 22 -77 2

输出样例:

-77 -5 2 3 3 7 22 66


void bubble (int a[ ], int n)
{
	int i, k, temp;
	for( i=0; i<n-1; i++ ) {
		for( k=0; k<n-i-1; k++ ) {
			if( a[k] > a[k+1] ) {
				 temp = a[k];
				 a[k] = a[k+1];
				 a[k+1] = temp;
			}
		}
	}
}
### 冒泡排序算法实现及原理 冒泡排序是一种基础的交换排序算法,其核心思想是通过多次比较和交换,将未排序部的最大值逐步移动到序列的末尾[^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 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值