目录
前言
冒泡排序一般用于对一些数组,或者一组数字来进行从大到小,从小到大来进行排序。比如我们随便输入成绩,然后让我们来进行大到小来排序,然后打印输出。简单又快捷,可以试试。
一、冒泡排序的思路。
冒泡排序它在使用过程中是采取替换的方式来进行的。
比如我们有一组没有排序的数字: 4 3 2 1,我们想把它们从小到大的进行排序。
首先我们要明白下标(比如根据上边的数组: 4 3 2 1 它们的下标是: 0 1 2 3 4 ,4的下标是0,3的下标是1,下标加1我们下标指向的数字就发生改变了。4 和 3 的下标加1,下标指向的数字就是 3 和 2 了,现在3和 2下标就来到 1和 2了)这里没写数字的交换只是写了下标的改变,指向的数字也发生改变而已。
一开始的数组和下标,用下划线来表示下标
4 3 2 1 | 没有改变 | 4 3 2 1 |
0 1 2 3 | 没有改变 | 0 1 2 3 |
我们先拿4 和 3 进行比较,4 比 3 大然后我们交换数字,下标加1
4 3 2 1 | 4 3进行交换, 4 3 2 1变成3 4 2 1 | 3 4 2 1 |
0 1 2 3 | 下标加1,0 1 下标来到 1 2 | 0 1 2 3 |
再拿4 和 2 进行比较,4 比 2 大然后我们交换数字,下标加1
3 4 2 1 | 4 2进行交换, 3 4 2 1变成 3 2 4 1 | 3 2 4 1 |
0 1 2 3 | 下标加1,1 2 下标来到 2 3 | 0 1 2 3 |
再拿4 和 1进行比较,4 比 1 大然后我们交换数字,当4来到数组最后,我们结束这第一轮的交换。开始第二轮循环交换
3 2 4 1 | 4 1进行交换, 3 2 4 1变成 3 2 1 4 | 3 2 1 4 |
0 1 2 3 | 下标加1,2下标来到3,3下标后面没有数字,所以不变 | 0 1 2 3 |
开始第二轮的数组交换。下标又从0 和 1开始标记。开始不变
3 2 1 4 | 不变 | 3 2 1 4 |
0 1 2 3 | 不变 | 0 1 2 3 |
我们先拿3 和 2 进行比较,3 比 2 大然后我们交换数字,下标加1
3 2 1 4 | 3 2进行交换, 变成2 3 1 4 | 2 3 1 4 |
0 1 2 3 | 下标加1,0 1 下标来到 1 2 | 0 1 2 3 |
然后进行一轮轮的比较,交换最后我们就可以得到数组1 2 3 4。
根据上边的了解,我们再来看代码是如何实现的。
二、代码实现
1.创建数组,计算数组的个数
代码如下:
//printf的头文件
#include <stio.h>
int main()
{
//创建数组
int arr[] = { 4, 3, 2, 1, };
//计算数组的个数,把得到的个数给sz
int sz = sizeof(arr) / sizeof(arr[0]);
return 0;
}
2.创建循环变量,冒泡排序的主要代码
代码如下:
int main()
{
//创建数组
int arr[] = { 4, 3, 2, 1, };
//计算数组的个数,把得到的个数给sz
int sz = sizeof(arr) / sizeof(arr[0]);
//创建循环的变量
int i = 0;
int j = 0;
//循环实现冒泡排序,i < sz(sz是i要循环的次数)
for (i = 0; i < sz; i++)
{
//sz - 1是要得到下标的具体数值,比如:4 3 2 1,
//他们的下标是0 1 2 3,下标是从0开始的,所以我们要减1得到数组的正确标记
// - i是要减去每完成i轮的次数
for (j = 0; j < sz - 1 - i; j++)
{
//if判断arr[j](下标0)如果大于arr[j + 1]就进去交换数值,
//也可以改成小于变为从大到小
if (arr[j] > arr[j + 1])
{
//进行交换
//创建tmp来接收数组的数字,不然我们的数字替换成其他数字了
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
return 0;
}
3.打印数组和完整代码
代码如下:
int main()
{
//创建数组
int arr[] = { 4, 3, 2, 1, };
//计算数组的个数,把得到的个数给sz
int sz = sizeof(arr) / sizeof(arr[0]);
//创建循环的变量
int i = 0;
int j = 0;
//循环实现冒泡排序,i < sz(sz是i要循环的次数)
for (i = 0; i < sz; i++)
{
//sz - 1是要得到下标的具体数值,比如:4 3 2 1,
//他们的下标是0 1 2 3,下标是从0开始的,所以我们要减1得到数组的正确标记
// - i是要减去每完成i轮的次数
for (j = 0; j < sz - 1 - i; j++)
{
//if判断arr[j](下标0)如果大于arr[j + 1]就进去交换数值,
//也可以改成小于变为从大到小
if (arr[j] > arr[j + 1])
{
//进行交换
//创建tmp来接收数组的数字,不然我们的数字替换成其他数字了
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
//最后我们打印数组
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
三、以输入的形式进行排序
这只是增加了一个输入的代码,挺简单的就不多写注释了
1.完整代码
代码如下:
int main()
{
//n是你要输入多少数字的
int n = 3;
int arr[40] = { 0 };
int i = 0;
//这里n有几次就循环多少次,然后把数字存到数组里
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
总结
这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了冒泡排序的一些小方法,还有一些其他的代码实现,这里我就不多写了(其实是多的我也不会了)。
文章还有许多的瑕疵,这个我也是第一次写还请多多包涵。
然后谢谢观看