冒泡排序:
冒泡排序是一种简单且基础的排序算法,其核心思想是通过多次遍历待排序的数组,比较相邻元素并交换顺序,使较大的元素逐渐"冒泡"到数组的末尾。这种算法因其名字来源于气泡的上升运动而得名。

cs
#include <stdio.h>
void pai(int arr[],int n)
{
int i,j,temp;
for (i = 0;i < n - 1;i++) //控制进行次数
{
for (j = 0;j < n - 1;j++) //进行排序
{
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void print(int arr[], int n)
{
for (int i = 0;i < n; i++) //输出arr[]
{
printf("%d ", arr[i]);
//printf("\n");
}
}
int main()
{
int arr[6] = { 33,44,1,0,44,999 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("未排序数组: \n");
print(arr, n);
pai(arr, n);
printf("\n");
printf("排序后数组: \n");
print(arr, n);
return 0;
}
冒泡排序的基本原理
- 比较相邻元素:从数组的第一个元素开始,依次比较相邻的两个元素。如果前一个元素大于后一个元素,则交换它们的位置。
- 重复遍历:每一轮遍历结束后,最大的元素会被放置在数组的末尾。因此,下一轮遍历可以减少一次比较,因为最后一个元素已经是最大的。
- 终止条件:当某一轮遍历中没有发生任何交换时,说明数组已经完全有序,可以提前结束排序。
上述代码中,外层循环控制排序的轮数,内层循环负责比较和交换。
代码详解
- 外层循环:控制排序的轮数,每一轮将未排序部分的最大值"冒泡"到末尾。
- 内层循环 :负责比较和交换相邻元素。每一轮内层循环的范围逐渐减少,因为每轮结束后最后一个元素已经是最大的。
- 交换操作 :使用临时变量
temp
来交换两个元素的位置。
现在的冒泡排序有什莫问题吗?
答案是有的!!
现在的冒泡排序如果遇到已经排序好的数组如:
cs
arr[5]={1,2,3,4,5};
遇到这种的代码 现在的冒泡排序仍然会进行许多次, 进行n-1次。
这样的代码太过于拖沓了,可以进行优化。
优化冒泡排序:
- 添加标志位:在某一轮遍历中如果没有发生任何交换,说明数组已经有序,可以提前结束排序。
- 减少不必要的比较:在每轮遍历中记录最后一次交换的位置,下一轮从该位置开始比较。
优化后的代码如下:
cs
void pai(int arr[], int n) {
int i, j, temp, swapped;
for (i = 0; i < n - 1; i++) {
swapped = 0;
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1;
}
}
// 如果没有发生交换,说明数组已有序
if (!swapped) break;
}
}
总结
冒泡排序是一种简单直观的排序算法,适合初学者学习和理解排序的基本原理。尽管其效率较低,但在小规模数据或教学场景中仍然具有一定的应用价值。通过优化,可以进一步提高其性能,但其基本思想和实现方式仍然保持不变