简单排序算法:冒泡法排序(Java)

简介:

冒泡排序口诀:两两比较,两两交换。

操作对象:乱序数组

操作方式:双循环以及内层循环中条件的判断

操作结果:升序或降序数组

    举例:

    给定一个数组:int[] arr = new int[]{99,33,21,14,65,11,9,45,22,10};

对此数组进行升序排列。

    分析:越大的数越要下沉,最大的数沉底;越小的数越要上浮,最小的数浮顶。上面数组中一共有10个数,实现这10个数的升序排列一共分两方面:

    第一方面:一轮一轮(或者说一趟一趟)地从左往右遍历数组,每一轮操作之后产生一个最大数放到数组最右侧,但不能超过上一轮的最大值。对于数组arr,第一轮操作后,99放在arr[9]第二轮操作后,65放在arr[8]第三轮操作后,45放在arr[7];……一共要操作九轮。数组中有10个数,要操作九轮。因为操作到第九轮的时候,产生第九个最大数,那第九个最大数应该放在arr[1]的位置,第十个最大数即最小数已经没有与之比较的对象因此对于十个数的升序排列是操作九轮。那么对于n个数的排列,推理一下当然是操作n-1轮。由此得出轮数与数组长度的关系:轮数==数组长度-1。那么中间还有一个问题:在每一轮的操作中,大数如何一步步地沉底呢?在每一轮操作中,一共需要比较多少次呢?每轮比较的次数与轮数是什么样的关系?请看第二方面的说明:

    第二方面:                      

           开始                    {99,33,21,14,65,11,9,45,22,10}  比较次数:0

            第一轮:99>33?  true  {33,99,21,14,65,11,9,45,22,10}  比较次数:1

                    99>21?  true  {33,21,99,14,65,11,9,45,22,10}  比较次数:2

                    99>14?  true  {33,21,14,99,65,11,9,45,22,10}  比较次数:3

                    99>65?  true  {33,21,14,65,99,11,9,45,22,10}  比较次数:4

                    99>11?  true  {33,21,14,65,11,99,9,45,22,10}  比较次数:5

                    99>9?   true  {33,21,14,65,11,9,99,45,22,10}  比较次数:6

                    99>45?  true  {33,21,14,65,11,9,45,99,22,10}  比较次数:7

                    99>22?  true  {33,21,14,65,11,9,45,22,99,10}  比较次数:8

                    99>10?  true  {33,21,14,65,11,9,45,22,10,99}  比较次数:9

           第二轮: 33>21?  true  {21,33,14,65,11,9,45,22,10,99}

                    33>14?  true  {21,14,33,65,11,9,45,22,10,99}

                    33>65?  false {21,14,33,65,11,9,45,22,10,99}

                    ...

                    ...

                    ...


                    33>65?  false {21,14,33,11,9,45,22,10,65,99}  比较次数:8

           第三轮:比较次数:7

           第四轮:比较次数:6

           ...

           第九轮:比较次数:1

           

           于是得出如下关系:该轮次数 = 数组长度-该轮轮数

         又根据第一方面推理:总轮数 = 数组长度-1

            注意到结合数组下标从arr[0]开始的原理,设计出的双循环如下:

1
2
3
4
5
6
7
8
9
            for ( int  i= 0 ; i<arr.length- 1 ; i++){   //外循环控制轮数
                for ( int  j= 0 ; j<arr.length-i- 1 ;j++){    //内循环控制该轮次数
                    if (arr[j]>arr[j+ 1 ]){       //两两比较
                        int  temp = arr[j];     //1
                        arr[j] = arr[j+ 1 ];     //2
                        arr[j+ 1 ] = temp;       //3         1、2、3代码实现两两交换
                    }
                }
            }




本文转自yeleven 51CTO博客,原文链接:http://blog.51cto.com/11317783/1754127


                           

相关文章
|
2月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
149 5
|
2月前
|
机器学习/深度学习 运维 算法
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
235 0
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
|
3月前
|
机器学习/深度学习 算法 安全
【无人机3D路径规划】基于非支配排序遗传算法NSGAII的无人机3D路径规划研究(Matlab代码实现)
【无人机3D路径规划】基于非支配排序遗传算法NSGAII的无人机3D路径规划研究(Matlab代码实现)
202 1
|
2月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
135 0
|
2月前
|
机器学习/深度学习 算法 安全
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
|
3月前
|
机器学习/深度学习 算法 安全
【优化调度】基于matlab非支配排序遗传算法求解车辆充电调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab非支配排序遗传算法求解车辆充电调度优化问题研究(Matlab代码实现)
108 0
|
25天前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
231 35
|
1月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
2月前
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
134 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。

热门文章

最新文章