常用算法之冒泡排序

冒泡排序:

据说是八大排序中的其一,通俗的意思就是讲,在一组数据中,相邻元素依次比较大小,最大的放后面,最小的冒上来(or 反过来)

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

  冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

1、确定第1个数的位置:依次与其它数据相比:

  --第1次和2相比,比2大,则右移1位到2的位置上, 这时候,1在2位置上了

  --再与3相比,如果比3大,再向右移1位到3的位置上,不大则不用移动,这时候1在3位置上

  --再与4相比,如果比4大,再向右移动1位到4的位置上,不大则不用移动,这时候1在4位置上

  --再与5相比,如果比5大,再向右移动1位到5的位置上,不大则不用移动,这时候1在5位置上

  经过以上一轮4次的比较,我们可以确定1的位置。

下图是流程图:

2、确定第2个数的位置:依次与除1以外的其它数据相比(因为第1轮比较1的时候,已经比过了,已经确定了1的位置,所以这以后都没必要再跟1比了):

  --第1次和3相比,比3大,则右移1位到3的位置上, 这时候,2在3位置上了,不大则不用移动

  --再与4相比,如果比4大,再向右移1位到4的位置上,这时候2在4位置上,不大则不用移动

  --再与5相比,如果比5大,再向右移动1位到5的位置上,这时候1在5位置上,不大则不用移动

  经过以上一轮3次的比较,我们可以确定2的位置。

3、确定第3个数的位置:依次与除1、2以外的其它数据相比(因为第1轮、第2轮比较1、2的时候,已经比过了,已经确定了1、2的位置,所以这以后都没必要再跟1、2比了):

  --第1次和4相比,比4大,则右移1位到4的位置上, 这时候,3在4位置上了,不大则不用移动

  --再与5相比,如果比5大,再向右移1位到5的位置上,这时候2在5位置上,不大则不用移动

  经过以上一轮2次的比较,我们可以确定3的位置。

4、确定第4个数的位置:依次与除1、2、3以外的其它数据相比(因为第1轮、第2轮、第3轮比较1、2、3的时候,已经比过了,已经确定了1、2、3的位置,所以这以后都没必要再跟1、2、3比了):

  --第1次和5相比,比5大,则右移1位到5的位置上, 这时候,4在5位置上了,不大则不用移动

  经过以上一轮1次的比较,我们可以确定4的位置。

5、最后的5不用再比较了,因为已经确定了其它剩下的位置,第一轮都有与5比较过,所以其它4个坑占了后,剩下的5你还有啥选择呢。已经被固定了.

以上我只过第1轮的时候的图,让大家能了解一下站队的一个大体情况,近而来分析,那么接下来,我们来分析一下,如何用程序实现这个逻辑:

1、首先我们就定5个数吧,那么我们可以把这5个数放在一个数组里。int[] nums={23,12,34,2,67}或int[] nums=new int[]{23,12,34,2,67},这里怎么用:开心就好!

2、要进行4轮的比较才能确定,这一定是个循环,固定次数的,我们用for吧。for(int i=0;i<4;i++),当然你用for(int i=1;i<=4;i++)也行,不过数组是从0开始的,所以习惯i从0开始,这样也有利于看直接:数组[i],不然还每次得:数组[i-1]。4也就是:数组.length-1

3、每一轮里面要循环不同次数比较数据确定位置,那么在第2步循环中,要再有一个循环,这是多重循环,也叫嵌套循环

这个for循环,我们也要来分析一下,它的范围:

第几轮(我们定的是变量i)            (内层循环)次 变量j

1      对应数组下标i是0            4        外层循环第1次,内层需要循环4次 =5-i-1

     2      对应数组下标i是1          3        外层循环第2次,内层需要循环3次  =5-i-1

       3      对应数组下标i是2            2        外层循环第3次,内层需要循环2次  =5-i-1

     4      对应数组下标i是3            1        外层循环第4次,内层需要循环1次  =5-i-1

内层for循环,我们设置变量j,for(int j=0;j< ;j++),j<这个值,要找出来

双重循环的原理是:外层循环1次,内层循环1轮(遍历),上表已经很清晰的标示出了j每轮循环里面要执行的次数,但因为我们是i是从0开始的,所以j的范围应该是5-i-1,也就是:数组.length-1-i

4、在内层循环中还有一个条件,即前一位比后一位大的话,进行挪位,不大则不变位置,如果涉及挪位的时候,我们需要一个变量来倒腾一下交换要挪位的2个值。

/** 从小到大 */
    private static void FromMinToMax() {
        int count[] = { 89, 18, 57, 48, 27 };
        for (int i = 0; i < count.length - 1; i++) {
            for (int j = 0; j < count.length - 1 - i; j++) {
                if (count[j] > count[j + 1]) {
                    int temp = count[j];
                    count[j] = count[j + 1];
                    count[j + 1] = temp;
                }
            }
            System.out.print("第" + (i + 1) + "次排序结果:");
            for (int k = 0; k < count.length; k++) {
                System.out.print(count[k] + "\t");
            }
            System.out.println();
        }
        System.out.print("从小到大排序结果:");
        for (int con : count) {
            System.out.print(con + "\t");
        }
    }

当然反之亦然 从大到小的排序例子:

private static void FromMaxToMin() {
        int score[] = { 20, 79, 35, 60, 89, 18, 45, 58 };
        for (int i = 0; i < score.length - 1; i++) {// 进行n-1次排序

// 对当前无序区间score[0....length-i-1]进行排序(缩小控制范围)
            for (int j = 0; j < score.length - i - 1; j++) {
                if (score[j] < score[j + 1]) {// 把小的值交换到后方
                    int temp = score[j];
                    score[j] = score[j + 1];
                    score[j + 1] = temp;
                }
            }
            System.out.print("第" + (i + 1) + "次排序结果:");
            for (int a = 0; a < score.length; a++) {
                System.out.print(score[a] + "\t");
            }
            System.out.println("");
        }
        System.out.print("最终排序结果:");
        for (int a = 0; a < score.length; a++) {
            System.out.print(score[a] + "\t");
        }
    }

时间: 2024-12-28 00:53:55

常用算法之冒泡排序的相关文章

Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法

前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本知识: 数组的定义:数组(Array)是相同数据类型的数据的有序集合. 数组是引用数据类型. 数组的三个特点: [1]数组长度是确定.数组一旦申请完空间,长度不能发生变化,用length属性访问. [2]数组的元素都是同一数据类型. [3]数组是有序的 .每个元素通过下标/索引标记,索引从0开始.

算法之常用排序:冒泡排序、选择排序

冒泡排序: 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 #!/bin/env python #_*_ coding:utf-8 _*_ #算法之冒泡排序 li = [13,22,6,99,11] for m in range(len(li)-1): if li[m] > li[m+1]: temp = li[m] li[m] = li[m+1] li[m+1] = temp #第一次# 13>22 —>pass #第二次# 22>6 ->li =

常用算法

快速排序 维基百科详细说明 public static void QuickSort(int[] numbers, int left, int right) { if (left < right) { int middle = numbers[(left + right) / 2]; int i = left - 1; int j = right + 1; while (true) { while (numbers[++i] < middle) { } while (numbers[--j]

排序常用算法总结

排序算法:一种能将一串数据依照特定的排序方式进行排列的一种算法. 排序算法性能:取决于时间和空间复杂度,其次还得考虑稳定性,及其适应的场景. 稳定性:让原本有相等键值的记录维持相对次序.也就是若一个排序算法是稳定的,当有俩个相等键值的记录R和S,且原本的序列中R在S前,那么排序后的列表中R应该也在S之前. 以下来总结常用的排序算法,加深对排序的理解. 排序算法目录 冒泡排序 插入排序 希尔排序 选择排序 快速排序 归并排序 堆排序 计数排序 桶排序 基数排序 总结 冒泡排序 原理 俩俩比较相邻记

Python常用算法

本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算法应该具有以下七个重要的特征: ①有穷性(Fin

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

【常用算法思路分析系列】排序高频题集

最近在牛客上整理常用的一些算法思路,[常用算法思路分析系列]主要是针对一些高频算法笔试.面试题目的解题思路进行总结,大部分也给出了具体的代码实现,本篇文章是对排序相关题目的思路分析. 1.简单分类 首先对一些常用算法按空间复杂度进行分类如下: O(1): 冒泡排序.选择排序.插入排序.希尔排序.堆排序 O(logN)~O(N): 快速排序 O(N): 归并排序 O(M): 计数排序.基数排序 2.对一个基本有序的有序的数组排序,选择哪种排序算法? 基本有序:指如果把数组排好序的话,每个元素移动的

php 实现常用算法

//冒泡排序 从小到大对一组数排序 function mp($array){ $count = count($array); if ($count <= 0) return false; for($i=0; $i<$count; $i++) { for($k=$count-1; $k>$i; $k--) { if($array[$k] < $array[$k-1]) { $tmp = $array[$k]; $array[$k] = $array[$k-1]; $array[$k-

常用算法总结

常用算法总结 一.排序 http://www.cnblogs.com/fzhe/archive/2013/01/18/2866651.html 快速排序 归并排序 堆排序 选择排序 冒泡排序 插入排序 希尔排序 二.  查找 静态查找 a)  顺序查找 b) 有序表的查找之折半查找 c)  索引表 动态查找 a)  二叉排序树查找 b)  平衡二叉树 c)  B-树 :常用于文件系统中 d)  B+树 :区别于B-树,有n棵子树的节点中含有n个关键字.叶子节点按序自动排列.B+树可以按序查找也可