一.简介
冒泡排序的基本思想是:通过重复交换相邻的不按顺序的项来工作,每一遍的排序过程中,都会将一个未排序的元素放置到已排序的末尾,直到所有元素都已排序。在每一遍排序过程中,都会将一个未排序的元素放置到已排序的末尾,这个过程被称为“冒泡”,因为在这个过程中,小的元素会像气泡一样“冒”到数列的顶部。
二.代码部分
#include<stdio.h>
void paixu(int arr[], int size);
void paixu(int arr[], int size) {
int i, j, tem;
for (i = 0; i < size - 1; i++) //外层循环为排列次数,size-1
{
int count = 0;
for (j = 0; j <size - 1 - i; j++)//内层循环比较两个数,size-1-i表示减去已经排好的数
{
if (arr[j] > arr[j + 1]) //从小到大排序
{
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1]=tem;
count = 1;
}
}
if (count == 0)
{
break;
}//如果某一次没有交换位置,说明已经排好序,退出循环
}
}
int main() {
int arr[10];
int i;
printf("请输入10个数\n:");
for (i = 0; i < 10; i++)
{
scanf_s("%d", &arr[i]);
}
printf("排序前的数组:");
for (i = 0; i < 10; i++)
{
printf("%d",arr[i]);
}
printf("\n排序后的数组:\n");
paixu(arr, 10);
for ( i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
return 0;
}
三.核心代码分析
if (arr[j] > arr[j + 1])
:这是一个条件判断,它比较当前元素arr[j]
和下一个元素arr[j + 1]
。如果当前元素大于下一个元素,那么就执行花括号内的代码。//如9>8执行int tem = arr[j];
:这行代码将arr[j]
的值保存到临时变量tem
中。//tem=9arr[j] = arr[j + 1];
:这行代码将arr[j + 1]
的值赋给arr[j]
。arr[j + 1]=tem;
:这行代码将临时变量tem
中保存的原来的arr[j]
的值赋给arr[j + 1]
。\\这两个语句用于把89交换位置count = 1;
:每次成功的交换操作后,count
都会设置为1。这个变量用来检查数组是否已经排好序。//通过不停的比较和交换,最后·会把最大的数给移到最后面,其余的数会往前冒泡,重复这个过程,一共执行n-1次,n-1-i是为了不和最后一个已经排好的数比较
四.总结
冒泡排序的优点:
- 算法简单易懂,容易实现。
- 稳定排序,不改变相同元素的相对顺序。
冒泡排序的缺点:
- 时间复杂度为O(n^2),不适合大规模数据的排序。
- 效率低下,如果数组已经有序或者基本有序,冒泡排序会更快,因为会提前结束循环。
因此,冒泡排序适用于小数据量或者对稳定性要求较高的场景,但不适用于大数据量或高效率要求的场景。