博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基础算法之冒泡排序Bubble Sort
阅读量:5291 次
发布时间:2019-06-14

本文共 2773 字,大约阅读时间需要 9 分钟。

原理

将相邻的数据两两进行比较,按照从小到大或者从大到小的顺序进行位置交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后从头开始再次进行两两比较交换,直到倒数第二位时结束。按照此规则,若干趟数据便按照了从小到大或者从大到小完成了排序。

例子

将数组[3,6,4,2,5,1]进行从大到小排序

第一趟排序

第一次两两比较,3<6 交换

交换前:| 3 | 6 | 4 | 2 | 5 | 1 |

交换后:| 6 | 3 | 4 | 2 | 5 | 1 |

第二次两两比较,3<4 交换

交换前:| 6 | 3 | 4 | 2 | 5 | 1 |

交换后:| 6 | 4 | 3 | 2 | 5 | 1 |

第三次两两比较,3>2 不交换

交换前:| 6 | 4 | 3 | 2 | 5 | 1 |

交换后:| 6 | 4 | 3 | 2 | 5 | 1 |

第四次两两比较,2<5交换

交换前:| 6 | 4 | 3 | 2 | 5 | 1 |

交换后:| 6 | 4 | 3 | 5 | 2 | 1 |

第五次两两比较,2>1不交换

交换前:| 6 | 4 | 3 | 2 | 2 | 1 |

交换后:| 6 | 4 | 3 | 5 | 2 | 1 |

 

第二趟排序

第一次两两比较,6>4不交换

交换前:| 6 | 4 | 3 | 5 | 2 | 1 |

交换后:| 6 | 4 | 3 | 5 | 2 | 1 |

第二次两两比较,4>3不交换

交换前:| 6 | 4 | 3 | 5 | 2 | 1 |

交换后:| 6 | 4 | 3 | 5 | 2 | 1 |

第二次两两比较,3<5交换

交换前:| 6 | 4 | 3 | 5 | 2 | 1 |

交换后:| 6 | 4 | 5 | 3 | 2 | 1 |

第三次两两比较,3>2不交换

交换前:| 6 | 4 | 5 | 3 | 2 | 1 |

交换后:| 6 | 4 | 5 | 3 | 2 | 1 |

 

第三趟排序

第一次两两比较,6>4不交换

交换前:| 6 | 4 | 5 | 3 | 2 | 1 |

交换后:| 6 | 4 | 5 | 3 | 2 | 1 |

第二次两两比较,4<5交换

交换前:| 6 | 4 | 5 | 3 | 2 | 1 |

交换后:| 6 | 5 | 4 | 3 | 2 | 1 |

第三次两两比较,4>3不交换

交换前:| 6 | 5 | 4 | 3 | 2 | 1 |

交换后:| 6 | 5 | 4 | 3 | 2 | 1 |

 

第四趟排序无交换

第五趟排序无交换

至此,排序完毕,输出最终结果6 5 4 3 2 1

动画演示

代码参考

static void Main(string[] args)        {            int[] intArray = { 3, 6, 4, 2, 5, 1 };            Bubble_Sort(intArray);            foreach (var item in intArray)            {                Console.WriteLine(item);            }            Console.ReadLine();        }        static void Bubble_Sort(int[] unsorted)        {            int temp;            for (int i = 0; i < unsorted.Length - 1; i++)            {                for (int j = 0; j < unsorted.Length - 1 - i; j++)                {                    if (unsorted[j] < unsorted[j + 1])                    {                        temp = unsorted[j];                        unsorted[j] = unsorted[j + 1];                        unsorted[j + 1] = temp;                    }                }            }        }

算法优化

假如一个数组进行很少趟就能排成有序数组,那么运行上面的代码就有点浪费了。对算法进行优化,详情请看一下代码

     static void Bubble_Sort(int[] unsorted)        {            int temp;            bool flag; //新增标志位            for (int i = 0; i < unsorted.Length - 1; i++)            {                flag = false;                for (int j = 0; j < unsorted.Length - 1 - i; j++)                {                    if (unsorted[j] < unsorted[j + 1])                    {                        temp = unsorted[j];                        unsorted[j] = unsorted[j + 1];                        unsorted[j + 1] = temp;                        flag = true;  //发生交换,则标志位改变                    }                }                //数据未发生1次交换,标志位不变,表示数组已为有序装态,可提前结束外层循环                if (!flag)                {                    break;                }            }        }

参考资料

 

转载于:https://www.cnblogs.com/jackbase/p/4270246.html

你可能感兴趣的文章
右侧导航栏(动态添加数据到list)
查看>>
用Nginx+Lua(OpenResty)开发高性能Web应用
查看>>
81、iOS本地推送与远程推送详解
查看>>
Sharepoint online 如何使用asp.net开发项目!!!
查看>>
C#基础_注释和VS常用快捷键(一)
查看>>
http协议
查看>>
动态调用webservice
查看>>
2017-05-18
查看>>
python带header
查看>>
虚拟DOM
查看>>
IClient for js开发之地图的加载
查看>>
用css画三角形(提示框三角形)
查看>>
Uber中国在地方城市的人员架构是怎样的?
查看>>
再来一篇装逼老文章:屏幕传输算法
查看>>
Delphi 7下最小化到系统托盘
查看>>
抖动代码
查看>>
lsblk请参阅块设备
查看>>
SVM-SVM概述
查看>>
STL algorithm算法lower_bound和upper_bound(31)
查看>>
linux系统下怎么安装.deb文件?
查看>>