引言:冒泡排序的理解与使用。冒泡排序,顾名思义就是像一个气泡一样排序。
冒泡排序的核心思想是:
按顺序每次选择一个数与其后的每一个数进行两两比较,并根据升序还是降序对二者进行交换位置。
冒泡排序的两个核心问题:
1、确定趟数
2、确定两两比较次数
假设我们有n个数需要被排列
对于1,我们发现经过一趟完整的两两比较后,必然会有一个数被排好,也就是说每一趟能够排好一个数,所以我们需要排n-1(因为最后一个数不用排,当前面数都排好后,最后一个数自然成序)趟。
对于2,假设当前排到第k个数,我们发现,我们只需要在需要排的数后进行排序(因为前面经过几趟已经被排好,并不需要重复排)所以需要两两比较的次数为n-1-k次
程序如下:
#define _CRT_SECURE_NO_WARNINGS 1//避免scanf函数报错
#include <stdio.h>
void bubble(int arr[], int sz)//形参arr实际上是指针
{
int k = 0;
for (k = 0; k < sz - 1; k++)//确定趟数
{
int y = 0;
for (y = 0; y < sz - 1 - k; y++)
{
if (arr[y] > arr[y + 1])//一趟冒泡排序的过程
{
int tmp = 0;//交换
tmp = arr[y];
arr[y] = arr[y + 1];
arr[y + 1] = tmp;
}
}
}
}
void main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int j = 0;
bubble(arr, sz);//sz必须在外面算,因为传进去的数组名是数组首地址,在外部函数计算的话会出错
for (j = 0; j <= 9; j++)
{
printf("%d ", arr[j]);
}
}
运行并验证:
?总结:
一定要注意确定趟数和两两比较次数,其次就是对于数组元素个数的求法以及函数的传参形式要理解。
|