c语言实现冒泡法排序

本文介绍了一种使用C语言实现的冒泡排序算法。该算法通过比较相邻元素并交换位置来对数组进行排序。代码中定义了一个布尔类型的变量用于跟踪数组是否已经排序完成,以提高效率。
c语言实现冒泡法排序,如下:

void _bubbleSort(int a[],int length)
{
int i,j,temp;
int bools;
bools = TRUE;
for(i=0;i<length-1 && bools;++i)
{
bools = FALSE;
for(j=0;j<length-i;++j)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
bools = TRUE;
}
}
}
}

因为c语言中没有bool类型,注意引用时的头文件声明TRUE和FALSE值分别为1和0:
#define TRUE  1
#define FALSE 0
<think>我们将使用C语言实现冒泡排序算法,并添加详细注释说明。 冒泡排序的基本思想:重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。 遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 优化点:设置一个标志位,如果在一趟遍历中没有发生交换,说明数组已经有序,可以提前结束排序。 步骤: 1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这样在最后的元素应该会是最大的数。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 重复步骤1~3,直到排序完成。 时间复杂度: 最好情况(已经有序): O(n) 最坏情况(逆序): O(n^2) 平均时间复杂度: O(n^2) 空间复杂度: O(1) 原地排序 稳定性:稳定排序 我们将编写一个函数bubble_sort,接受一个整数数组和数组长度,对数组进行升序排序。</think># 冒泡排序在C语言中的实现 冒泡排序是一种简单直观的排序算法,特别适合用C语言实现。下面我将详细介绍冒泡排序的原理,并提供完整的C语言实现代码。 ## 冒泡排序原理 冒泡排序的核心思想是重复遍历待排序序列,比较相邻元素,如果顺序错误就交换它们。每次遍历会将当前未排序部分的最大元素"冒泡"到正确位置。 ### 算法步骤: 1. 从数组的第一个元素开始,比较相邻的两个元素 2. 如果前一个元素大于后一个元素,则交换它们的位置 3. 对每一对相邻元素重复步骤1-2,直到数组末尾 4. 重复上述过程,但每次遍历时忽略最后一个已排序的元素 5. 当整个数组没有发生任何交换时,排序完成 ## C语言实现代码 ```c #include <stdio.h> #include <stdbool.h> // 用于bool类型 // 冒泡排序函数 void bubble_sort(int arr[], int n) { // 外层循环控制遍历次数 for (int i = 0; i < n - 1; i++) { bool 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; } } } // 打印数组函数 void print_array(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } // 主函数测试冒泡排序 int main() { // 测试数据 int data[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(data) / sizeof(data[0]); printf("原始数组: "); print_array(data, n); // 调用冒泡排序 bubble_sort(data, n); printf("排序后数组: "); print_array(data, n); return 0; } ``` ## 代码解释 ### 1. 冒泡排序函数 `bubble_sort()` ```c void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { bool 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; } } } ``` - **外层循环**:控制遍历次数,最多需要n-1次遍历 - **内层循环**:比较相邻元素并进行交换 - **优化**:使用`swapped`标志检测是否发生交换,如果没有交换说明数组已有序,提前结束排序 - **交换逻辑**:使用临时变量`temp`进行元素交换 ### 2. 辅助函数 `print_array()` ```c void print_array(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } ``` 用于打印数组内容,方便观察排序前后变化 ### 3. 主函数 `main()` ```c int main() { int data[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(data) / sizeof(data[0]); printf("原始数组: "); print_array(data, n); bubble_sort(data, n); printf("排序后数组: "); print_array(data, n); return 0; } ``` - 定义测试数据数组 - 计算数组长度:`sizeof(data) / sizeof(data[0])` - 调用排序函数并打印结果 ## 编译与运行 1. 将代码保存为`bubble_sort.c` 2. 使用GCC编译:`gcc bubble_sort.c -o bubble_sort` 3. 运行程序:`./bubble_sort` **输出结果:** ``` 原始数组: 64 34 25 12 22 11 90 排序后数组: 11 12 22 25 34 64 90 ``` ## 算法优化 ### 1. 双向冒泡排序(鸡尾酒排序) 改进的冒泡排序,交替进行从左到右和从右到左的遍历: ```c void cocktail_sort(int arr[], int n) { int left = 0; int right = n - 1; bool swapped; while (left < right) { swapped = false; // 从左到右遍历 for (int i = left; i < right; i++) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; swapped = true; } } right--; if (!swapped) break; swapped = false; // 从右到左遍历 for (int i = right; i > left; i--) { if (arr[i] < arr[i - 1]) { int temp = arr[i]; arr[i] = arr[i - 1]; arr[i - 1] = temp; swapped = true; } } left++; if (!swapped) break; } } ``` ### 2. 记录最后交换位置 减少不必要的比较: ```c void optimized_bubble_sort(int arr[], int n) { int last_swap = n - 1; while (last_swap > 0) { int k = last_swap; last_swap = 0; for (int j = 0; j < k; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; last_swap = j; // 记录最后交换位置 } } } } ``` ## 冒泡排序的特点 1. **优点**: - 实现简单,代码易于理解 - 空间效率高(O(1)额外空间) - 稳定排序(相同元素相对位置不变) - 对几乎有序的数据效率高 2. **缺点**: - 时间复杂度高(O()) - 不适合大规模数据排序 3. **适用场景**: - 教学目的 - 小型数据集(n < 1000) - 内存受限环境 - 输入数据基本有序的情况
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值