冒泡算法

算法-排序:冒泡

…衆ロ難τιáo~ 提交于 2020-02-03 03:54:47
编程里算法有很多,排序的算法也多种(冒泡算法、选择排序、插入排序、希尔排序、归并排序、快速排序、桶排序),各种排序也都有优缺点,特此分享出我的学习笔记,希望大家一起来学习探讨 冒泡算法思想 每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来,重复进行多次,直到没有相邻元素需要交换为止。 JAVA代码示例 package demo; /** * 冒泡排序:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来, * 重复进行多次,直到没有相邻元素需要交换为止 * @Author LQY * @Date 2020/2/2 */ public class BubblingSort { public static void main(String[] args) { demo1(); } /** * 案例1 * 将13,20,25,25,35,34.5,12,22,100用冒泡排序从大到小排序输出 */ public static void demo1(){ //先创建一个一维数组存放无序的数字 Double[] arg = new Double[]{13d,20d,25d,25d,35d,34.5d,12d,22d,100d}; //排序前结果 System.out.println("===========排序前结果================"); for (int i

排序算法(插入排序、冒泡排序、选择排序、希尔排序)

被刻印的时光 ゝ 提交于 2020-01-29 21:43:50
今天介绍一些排序算法,作为算法中最基础的部分,掌握各种排序算法以及指导各种排序算法的复杂度是有必要的。 插入排序 顾名思义,插入排序就是首先在待排序的数组中挑选出一个数,然后向前看,找到它所在的合适位置,将该位置后面的数都后移一次,再将选取的数插进去就行。其原理就跟咱们打扑克插牌是一样的。 以下面五个无序的数字为例: 2 3 1 5 4 第一次插入:2 3 1 5 4(3比2大,不用动) 第二次插入:1 2 3 5 4(将1插到第一位,2,3后移) 第三次插入:1 2 3 5 4(5前面没有比5大的,不动) 第四次插入:1 2 3 4 5(4插到第四位,5后移) void charupaixu ( int * a , int n ) { for ( int i = 1 ; i < n ; i ++ ) { int x = a [ i ] ; int j = i - 1 ; while ( j >= 0 && a [ j ] > x ) { a [ j + 1 ] = a [ j ] ; j -- ; } a [ j + 1 ] = x ; } } 算法复杂度为O(N²) 冒泡排序 冒泡排序这个名字期的非常生动,相信你看完下面的解释就会明白它为什么叫这个名字。 冒泡排序与插入排序不同,插入排序是选取一个对象与多个对象进行比较,而冒泡排序是两个元素互相比较,例如给出一串无序数组:2 3

常用的十大排序算法,经典图解版,『精』!!!

倾然丶 夕夏残阳落幕 提交于 2020-01-16 08:33:26
前言 本文或许是东半球分析十大排序算法最好的一篇文章,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。 预计阅读时间 47 分钟,强烈建议先收藏然后通过电脑端进行阅读。 No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 冒泡排序动图演示 图解冒泡排序 以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战: 从左往右依次冒泡,将小的往右移动 冒泡排序1 首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。 指针往右移动一格,接着比较: 冒泡排序2 比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。 指针再往右移动一格,继续比较: 冒泡排序3 比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ] 同样,指针再往右移动,继续比较: 冒泡排序4 比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ] 下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的

面试准备(算法部分)

断了今生、忘了曾经 提交于 2020-01-03 04:58:40
No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 冒泡排序动图演示 图解冒泡排序 以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战: 从左往右依次冒泡,将小的往右移动 冒泡排序1 首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。 指针往右移动一格,接着比较: 冒泡排序2 比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。 指针再往右移动一格,继续比较: 冒泡排序3 比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ] 同样,指针再往右移动,继续比较: 冒泡排序4 比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ] 下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的 2 就是已经排好序的数字。 通过这一轮不断的对比交换,数组中最小的数字移动到了最右边。 接下来继续第二轮冒泡: 冒泡排序5 冒泡排序6 冒泡排序7 由于右边的 2 已经是排好序的数字

排序算法合集(冒泡,选择,插入,堆排,快排)

孤者浪人 提交于 2020-01-01 14:57:17
1、冒泡排序 最初在学c语言时,老师就教的这个排序算法,原理比较简单: 从数组下标为0处开始遍历,相邻之间进行比较,若a[i]>a[i+1],则exchange(a[i],a[i+1]),当然也可以将小的往后传递,将此过程不断进行,那么最后数组就有序了。 要点:(1) 每遍历一遍,末尾就得到一个最大值(或最小值),那么接下来的遍历是不是每次都减少一个元素就好了,因为后边的已经排好序了啊。 (2) 遍历n-1遍就排好序了,因为最后一遍只剩一个元素了,它一定放那儿,所以最后一遍就不用遍历了。 当然如果数据小,又懒得优化,多进行几遍也一样可以排序的,比如这样: 1 for(int i=0;i<n;i++){ //遍历了n遍 2 3 for(int j=0;j<n-1;j++){ //每次比较当前元素和下一个元素,所以循环结束条件为n-1 4 5 { 6 7 if(a[j]>a[j+1]) 8 9 { int t=a[j]; 10 11 a[j]=a[j+1]; 12 13 a[j+1]=t; } 14 15 } 16 17 } 那么标准的冒泡排序,就是算法复杂度为n*(n-i)次也就是n^2如下: 1 for(int i=0;i<a.length-1;i++){ //遍历n-1遍就够了 2 3 for(int j=0;j<a.length-i-1;j++){ /

【排序算法】排序算法之冒泡排序

浪子不回头ぞ 提交于 2019-12-28 03:47:31
  最近在学习排序算法,就排序算法中的四大经典排序: 冒泡排序 、 快速排序 、 选择排序 、 插入排序 。会出一系列的讲解排序算法的博客。 一、冒泡排序的思想   冒泡,简单而言,现在我有5个小球,每个小球的重量不一(假设小球会漂浮),浮力与重力呈反比,球越重则沉到最底下,越轻则漂浮到最上面。这些球我把他们一股脑的扔到水里的时候,他们会根据自身的重量找到自己悬浮的位置,在“找位置”的过程中越轻的小球就会超越身边比他重的小球,往上漂浮。这就是冒泡。   冒泡排序就是采用的这种精髓,让小球们逐一和身边的小球比较,最轻的小球不断上升、越重的小球越在最下。   我们给这5个小球赋以不同的重量,现在五个小球的重量分别是100,15,76,24,55.   按照咱们刚刚分析的冒泡排序,咱们对这五个小球按从大到小进行排列:   首先用100和15相比较,100>15,符合由大到小的顺序,位置保持不变,五个小球的顺序为 100,15,76,24,55;   再用15和76相比较,15>76?显然是不对的,那么15和76交换顺序,五个小球的顺序为 100,76,15,24,55;   再用15和24相比较,显然位置需要调换,调换后的顺序为:100,76,24,15,55;   再用15和55相比较,位置需要调换,调换后的顺序为:100,76,24,55,15;   交换了4次之后,15为最后一位

冒泡算法的深入理解

試著忘記壹切 提交于 2019-12-18 12:49:12
简述 冒泡主要采用两个循环思想,外循环根据数据个数控制循环次数需要循环len(num)-1次、内循环主要是len(num)个数进行两两比较,每次遍历过程中把相对大的数排到最后。这样遍历len(num)-1次结果就是正序排列。 实例说明 代码: def xuanZe(nun):   for i in range(len(num)-1):     for j in range(i,len(nun)):       if num[i]>num[j]:         num[i],num[j]=num[j],num[i]   return num 图解: 其他方式 Python内置函数:list1.sort() 、reverselist.sort() 有人会问,既然有这么简便的排序算法为什么还要我们去费劲八叉的写什么冒泡算法?冒泡算法是初学代码算法最好的方式,它有助于初学者深入理解使用for循环。帮助我们在工作中灵活使用提升工作效率。 什么时候用for循环什么时候用while循环?请参照我的下一篇博客。有什么不明白的可以在评论区留言@我,我会持续为大家解答~ 来源: https://www.cnblogs.com/wangdadada/p/12059274.html

冒泡排序 java

不羁的心 提交于 2019-12-11 09:34:38
冒泡排序 这里用比较直观的栈,演示从栈底冒泡,排在栈顶的排序方法 我用一个特殊的例子, 倒序数组 来了解每一步算法的执行 { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} 图示 上图演示了 i = 0,第一次循环。利用循环 j 把栈底元素“0”排到栈顶的过程。数组变成 0 9 8 7 6 5 4 3 2 1 ; 其中, 黄色框 表示 具体对比范围,总是 j 指向的元素值跟上一个元素值 j - 1 比对 if ( arr [ j ] < arr [ j - 1 ] ) 紫色线段 表示 “0”和上一个元素交换后它的位置,多个这样的过程 由 j 控制的 最终将“0”移到栈顶 当然是因为它在数组中最小才被移到栈顶 int temp = arr [ j ] ; arr [ j ] = arr [ j - 1 ] ; arr [ j - 1 ] = temp ; i 的取值理解为栈顶有 i 个被排好序的元素 i ------------> 0 1 2 3 4 5 6 7 8 9 j ------------> 9 9 9 9 9 9 9 9 9 j ------------> 8 8 8 8 8 8 8 8 j ------------> 7 7 7 7 7 7 7 j ------------> 6 6 6 6 6 6 j ------------> 5 5 5 5 5 j -

排序算法学习(一):冒泡排序

旧城冷巷雨未停 提交于 2019-12-08 20:29:28
所谓排序即按照一定的规律将一组数据进行排列。排序算法的形式化定义如下:设存在一组无序序列 ​ ,并且存在一个函数 ​,在经过一系列对该序列中的元素位置调整后,使得新得到的序列满足对于任意的 ​,均有 ​(升序排序)或者 ​(降序排序)。针对不同的数据源的不同特性,人们设计出了不同的排序算法,以求对算法的时间复杂度或者空间复杂度进行优化。常见的排序算法有:冒泡排序,插入排序,快速排序,桶排序算法等。下面对各种排序算法的原理进行简述,并分析其优缺点。(以下在对排序算法的描述时,都假设将数据按照升序排序进行排列)。 冒泡排序 冒泡算法的步骤如下:比较相邻两个元素的大小,根据比较结果将两个元素按照从小到大的顺序排列,逐步向后移动,一直移动到末端。冒泡算法中的一轮过程如图1所示,每i轮的排序过程即是将第i个最大的元素移动到当前的数组中最大的位置。在每一轮的排序过程中,右边的已排序序列长度不断增长,最终使得整个序列都成为已排序序列。冒泡排序的完整过程如下图所示: 图1 冒泡排序的完整过程 冒泡排序算法的最基本实现 根据图1所描述的过程,冒泡排序算法的最基本的Python代码实现如下: [sourcecode language='python' padlinenumbers='true'] def bubbleSort(data:List[int])->List[int]: length =

python实现真正的冒泡排序算法(时间复杂度优化版)!

本小妞迷上赌 提交于 2019-12-05 03:56:32
近期很多童鞋在讨论大厂面试的算法题,有部分同学表示一脸懵逼,不知从何下手,还有一一部分同学写的冒泡排序算法是直接从网上复制下来的冒泡排序,大多数都没有考虑时间复杂度,说白了只是实现了冒泡的流程,严格来讲只能算是一个伪冒泡排序, 那么接下来给大家来捋一捋冒泡排序的原理,只有搞懂排序的原理,才能更好的掌握,写出真正的冒泡排序算法: 1、冒泡排序原理 直观点先看图(注:图片来源于网络)    从上图我们可以看出冒泡排序的规则,归纳几点如下: 冒泡的规则: 每一轮获取第一个数和后面的数据进行依次比较的过程,称为一轮冒泡的过程 每一轮冒泡.都是先拿第一个数,依次比对相邻的两个数,如果前一个数比后一个数大,则交换他们的位置,这一轮比较完毕,会把最大的数放在最后面。 然后反复重复上面的步骤(每一轮都能将前面数据中一个最大数,放到后面),直到一轮冒泡下来没有任何数据需交互位置,此时数据已经为有序状态 冒泡的次数: 假设列表的长度为n,冒泡排序是每次拿出来第一个元素,需要拿多少次呢?应该是列表的长度减1,意味着每一个长度为n的列表,需要冒泡 n-1 次 每次冒泡比较的次数: 每一次冒泡,都能排好一个数据的顺序,第一次冒泡,需要进行依次比较的次数为n次,那么随着次的增加排好的数据也会越多,需要比较的数据就越少。关系图如下: 第几次冒泡 比较的次数 1 n-1 2 n-2 3 n-3 4 n-4