【C语言】冒泡排序保姆级教学

六点半888 2024-08-30 12:05:05 阅读 95

C语言冒泡排序保姆级教学

动态图解:

在这里插入图片描述

拿排升序举例子

第一步:

将想要排序的数组中数值最大的那个数排到该数组的最后

具体实现如下图:

在这里插入图片描述

第一步代码实现

<code>for (int i = 1; i < n ; i++)//n为数组大小此处为4

{ -- -->

if (a[i - 1] > a[i])//注意越界,若排降序将大于改为小于即可

{

int tmp = a[i - 1];

a[i - 1] = a[i];

a[i] = tmp;

exchange = 1;

}

}

第二步(关键)

由于通过第一步我们已经将最大的数排在了数组最后

因此只需要将数组中第二大的数排到数组的倒数第二个位置

所以这里我们就采用双重循环来控制要排序的区间

这里就是我们要排序的区间从原来的a[0]到a[3]缩小到a[0]到a[2],

即每次将排序区间中最大的数排到该区间最后后,将该排序区间缩小1;

代码如下:

for (int j = 0; j < n - 1; j++)

//此处条件为j < n - 1 可以根据第二个for循环得到,当n为1时依旧要进入第二个for

//循环对a[0]与a[1]比较,所以第二个for循环条件n - j 最小应该为2,那么j最大就应该为 n - 2;

{

for (int i = 1; i < n - j; i++)//注意此处条件变为i < n - j,来达到每次排序完后区间缩小1的目的

{

if (a[i - 1] > a[i])//注意越界

{

int tmp = a[i - 1];

a[i - 1] = a[i];

a[i] = tmp;

}

}

冒泡排序的优化

这个双重循环已经可以解决排序问题了,但是可以对它进行优化,使得我们的代码更加健壮(运行时间更短),优化代码如下:

void BubbleSort(int* a, int n)//BubbleSort中文为冒泡排序的意思

{

for (int j = 0; j < n - 1; j++)

{

int exchange = 0;//在此定义一个变量来判断当前数组是否已经排好序了

for (int i = 1; i < n - j; i++)

{

if (a[i - 1] > a[i])//注意越界

{

int tmp = a[i - 1];

a[i - 1] = a[i];

a[i] = tmp;

exchange = 1;

}

}

//如果已经排好序就不会再进入第二个for循环,变量的值就不会为1,直接退出循环

if (exchange == 0)

{

break;

}

}

}

数组元素和大小大家可以自行修改

OK呀家人们,现在直接上全代码一观:

#include<stdio.h>

void BubbleSort(int* a, int n)

{

for (int j = 0; j < n - 1; j++)

{

int exchange = 0;

for (int i = 1; i < n - j; i++)

{

if (a[i - 1] > a[i])//注意越界

{

int tmp = a[i - 1];

a[i - 1] = a[i];

a[i] = tmp;

exchange = 1;

}

}

if (exchange == 0)

{

break;

}

}

}

int main()

{

int a[4] = { 4,2,3,1 };

BubbleSort(a, 4);

for (int i = 0; i < 4; i++)

{

printf("%d ", a[i]);

}

return 0;

}

运行结果:

在这里插入图片描述

如果有帮助到您,给俺个赞呗,制作不易,点赞收藏方便以后浏览。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。