1.什么是冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
2.个人对冒泡排序的理解
我们在读书的时候升国旗的的时候,每个班按一列从矮到高进行排队,敢开始没有调整队形的时候高矮参差不齐,因为老师站在队伍的前方,所以大家都想往后面站,后面可以干些小动作,假设有5个同学,A:183CM,B:188CM,C:175CM,D:166CM,E:168CM,最开始按ABCDE的位置站着的,刚开始A发现B比他高,打不过他,老老实实先站在第一个位置,B往后面看,发现C没他高,于是跟C换了个位置,C也没办法,谁叫人家比他高打不过呢。B换了位置后继续往后看发现D也没他高,让D到前面去,然后跟E比发现E也没他高让E又到他前面去,这是B往后面看发现没人了,就站在最后的位置玩起了手机。这时A很不爽,往后面看了看发现C比自己矮,于是跟C换了个位置,换了之后又跟D比,发现D也比他矮,又跟D换了个位置,在跟E比了一下发现E比他也要矮,就跟E也换了个位置,再往后看发现是A,吓一跳,不敢跟A比了,怕挨打,于是老老实实站个倒二的位置就知足了。然后C往后看跟D比了比发现比D要高,于是跟D换了个位置,然后继续跟E比发现比E高继续和E交换位置,往后看了看是A,不敢比了,怕挨打,于是只能站在第三个位置了。这时D特别不爽为什么他要站第一个位置于是跟E比了比身高,发现比他高,被E打了一顿,开始老实了,就站在第一个位置了。E往后看发现是C,之前比过的怕被打于是就不比了,大家都老老实实站好了,老师也高兴了,怎么现在的学生都这么听话,都还没说排队就站好了。
总的来说整个流程如下:183 188 175 166 168
第一轮:
183 188 175 166 168 //183和188比较不交换位置
183 175 188 166 168//188 和175比较交换位置
183 175 166 188 168//188 和166比较交换位置
183 175 166 168 188 //188 和168比较交换位置
第二轮:
175 183 166 168 188 //183 和175比较交换位置
175 166 183 168 188//183 和166比较交换位置
175 166 168 183 188//183 和168比较交换位置
第三轮:
166 175 168 183 188//166 和175比较交换位置
166 168 175 183 188//175 和168比较交换位置
第四轮 :
166 168 175 183 188//166 和168比较不交换位置
这样就实现了我们的冒泡排序。
冒泡排序代码实现:假设我们有n个元素冒泡排序比较相邻的两个元素,依次两两比较,第一轮比较n-1次我们就将最大的元素放到最后面了,于是第二轮比较我们就不用比较最后一个元素了,第二轮比较n-2次将剩余的元素中的最大的元素放在倒数第二个位置...依次类推第i轮比较n-i次我们就将剩余元素中的最大的元素放在了倒数第i个位置。这样就实现了我们的冒泡排序,但是如果如果中间就已经有序了,我们继续进行遍历增大了时间复杂度。如果一轮中没有交换,那么我们就退出不继续遍历了。于是这里设置了一个标志位flag,如果flag为0说明没有交换,那么直接退出循环,如果flag为1则继续执行循环。
代码如下:
#include <stdio.h>
void bubble_sort(int arr[], int len) //冒泡排序算法
{
int i, j, temp,flag=0;
for (i = 0; i < len - 1; i++) //循环的轮数
{
flag =0;//每遍历完一轮初始化标志位标志位
for (j = 0; j < len - 1 - i; j++)//每一轮循环需要比较的次数
{
if (arr[j] > arr[j + 1]) //判断如果数组前一个元素比后一个元素大则发生交换
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag =1;//发生交换将标志位置1
}
}
if(flag == 0) break;//如果一轮中都没有数据交换则退出循环
}
}
int main()
{
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };//定义数组
int len = (int) sizeof(arr) / sizeof(*arr);//数组长度
bubble_sort(arr, len);//进行冒泡排序
int i;
for (i = 0; i < len; i++)//打印排序后的数组
printf("%d ", arr[i]);
printf("\n");
return 0;
}
效果截图