提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基本思想
冒泡排序为什么叫冒泡排序,因为在每一次排序的过程里,较大的数都·会从右边冒出来,最小的数都会放在左边,就像水里面冒出的泡一样,所以叫冒泡排序,在日常生活中我们经常也会使用到这种排序的思想,比如说在整队的时候总是长得矮的在最左边,长得高的在最右边,每一次相邻两个人会互相比较高的往右移动,矮的往左移动。冒泡排序的过程就像这样,一个无序数组中相邻的两个元素之间互相比较大的往右移动小的往左移动,第一次比较完时最大的数就会出现在最右边,所以说总共比较的次数是整个数组里面存放的元素减去一次,假如是arr[n]代表这个数组里面有n个元素那要比较的次数就是n-1,如此循环往复直到比较完成。
一、代码实现
# include<stdio.h>
int main()
{
int q = 0;
int arr[10] = { 0 };
printf("请输入要排序的十个数\n");
for (int i = 0; i < 10; i++)
{
scanf_s("%d", &arr[i]);
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 9; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
while (q < 10)
{
printf("%d ", arr[q]);
q++;
}
return 0;
}
二、分布讲解
先看看这一段代码
# include<stdio.h>
int main()
{
int q = 0;
int arr[10] = { 0 };
printf("请输入要排序的十个数\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
这里代表是输入要比较的元素部分
先开始定义的q是为了在最后打印排序完成数组时用的
先定义一个整型数组,数组元素为10个。
然后在用一个for循环挨个挨个把元素输入 进数组里面,为什么这里i是<10呢因为数组的下标是从0开始的10个元素的下标就是0到9,for循环里面定义的i就是数组下标索引数组下标的所引就像导航一样,来指引数组元素的输入。
在看下一行
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 9; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
这里就是循环比较部分外侧for循环代表比较的趟数,内层for循环用来与周围相邻的元素之间的比较当外侧for循环=1时就代表这是第一次比较,然后进入到内层for循环 两两元素之间进行比较假如是我们输入的数组为{21,33,14,16,78,9,10,8,4,1}第一次比较就是21和33比较33比21大那么这两个元素位置不变进行第二次33与14进行比较33比14大33向右移动14向左移动,其中他们两个数字进行交换位置的过程中需要引入一个外部临时变量temp来存储数据,在进行第三次比较33与16进行比较33比16大所以,16向左移动33向右移动,然后进行第四次比较33与78进行比较78比33大所以说他们两个不换位置,然后进行第五次比较78与9比较,78比9大所以78和9交换位置9向左移动78向右移动,在进行第六次比较78和10,78比10大,交换位置,进行第七次比较78比8大交换位置,在进行第八次比较,78比4大交换位置,在进行第九次比较78比1大交换位置。至此第一次比较结束,接下来for等于2进行第二次比较
不难发现第一次比较完成之后最大的数出现在了最右边,在下一次比较的时候就不用在去与那个最大的数进行比较,在每一次比较的过程中都会产生一个在那一轮比较中最大的数,所以说内层for循环的比较次数是n-1次。
最后就是输出比较完成的数组了
while (q < 10)
{
printf("%d ", arr[q]);
q++;
}
return 0
当q<10时 执行循环打印数字,。每次打印完成q自己给自己加1,直到while循环里面的条件为假时结束。
运行结果为;
总结
总的来说冒泡排序还是很容易理解的,也是很简单的一个排序方法!