在学习的过程中,把学到的知识写出来一篇博客,可以帮助我们融会贯通,对知识更了解,记忆更深刻。
冒泡排序算是比较简单的一种排序方法,也是我接触的第一个排序算法。
冒泡排序使用的场景
1.冒泡排序作为最简单的排序方法,也有它自己的局限性,那就是只能对整型数组进行排序
比如说:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };//像这样元素类型都是整形的数组。我们这里用这个数组更直观方便的讲解。
int sz = sizeof(arr) / sizeof(arr[0]);//这里sz计算的是数组中有多少个元素个数,下边要用。
return 0;
}
冒泡排序的逻辑
1.冒泡排序其实就是两两相邻的数组进行比较,如果说要排升序的话,9和8进行比较9比8大,那么8放在前边,9放在后边,然后再重新比较,如图所示:
2.像这样我们叫做一趟,一趟下来9就被换到了最后边,那我们要进行多少趟呢,这就跟数组中元素个数有关系了,就是我们前边算出来的sz。冒泡排序中如果数组中有十个元素,那么像这样的趟数就有9趟,所以一个数组用冒泡排序,一趟解决一个数字,最终需要(sz-1)趟
冒泡排序代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//实现一个对整形数组的冒泡排序
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };//像这样元素类型都是整形的数组。
int sz = sizeof(arr) / sizeof(arr[0]);//这里sz计算的是数组中有多少个元素个数,下边要用。
for (int i = 0; i < sz; i++)//这里是先把没排序之前的数组打印出来,便于观察
{
printf("%d ", arr[i]);
}
printf("\n");
for (int i = 0; i < sz - 1; i++)//这里就是趟数
{
int j = 0;
int tmp = 0;//创建一个变量,这个变量是为了交换两个数,创建在这里是因为我们每一趟都需要把这个变量初始化,要不然这个变量就会带着上一趟交换过的数字,再交换就不对了。
for (j = 0; j < sz - 1-i; j++)//这里就是相邻的两个数比较,sz-1-i是因为我们发现第1趟有9对数字比较,第2趟有8对数字比较,这样写更提高效率,当然写成sz-1也可以,每一趟都让9对比较,只不过有的不需要交换。
{
if (arr[j] > arr[j + 1])//因为我们要排升序,所以比较之后,前面的数如果大于后边相邻的数,就把前边的数和后边相邻的数交换位置。如果要排降序的话,就把大于号改成小于号就可以了。
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这就是冒泡排序。 希望对大家有所助益,这是我的荣幸!