Java中的经典算法之冒泡排序(Bubble Sort)

Java中的经典算法之冒泡排序(Bubble Sort)

原理:比较两个相邻的元素,将值大的元素交换至右端。

思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

举例说明:要排序数组:int[] arr={6,3,8,2,9,1};

第一趟排序:

    第一次排序:6和3比较,6大于3,交换位置:  3  6  8  2  9  1

    第二次排序:6和8比较,6小于8,不交换位置:3  6  8  2  9  1

    第三次排序:8和2比较,8大于2,交换位置:  3  6  2  8  9  1

    第四次排序:8和9比较,8小于9,不交换位置:3  6  2  8  9  1

    第五次排序:9和1比较:9大于1,交换位置:  3  6  2  8  1  9

    第一趟总共进行了5次比较, 排序结果:      3  6  2  8  1  9

---------------------------------------------------------------------

第二趟排序:

    第一次排序:3和6比较,3小于6,不交换位置:3  6  2  8  1  9

    第二次排序:6和2比较,6大于2,交换位置:  3  2  6  8  1  9

    第三次排序:6和8比较,6大于8,不交换位置:3  2  6  8  1  9

    第四次排序:8和1比较,8大于1,交换位置:  3  2  6  1  8  9

    第二趟总共进行了4次比较, 排序结果:      3  2  6  1  8  9

---------------------------------------------------------------------

第三趟排序:

    第一次排序:3和2比较,3大于2,交换位置:  2  3  6  1  8  9

    第二次排序:3和6比较,3小于6,不交换位置:2  3  6  1  8  9

    第三次排序:6和1比较,6大于1,交换位置:  2  3  1  6  8  9

    第二趟总共进行了3次比较, 排序结果:         2  3  1  6  8  9

---------------------------------------------------------------------

第四趟排序:

    第一次排序:2和3比较,2小于3,不交换位置:2  3  1  6  8  9

    第二次排序:3和1比较,3大于1,交换位置:  2  1  3  6  8  9

    第二趟总共进行了2次比较, 排序结果:        2  1  3  6  8  9

---------------------------------------------------------------------

第五趟排序:

    第一次排序:2和1比较,2大于1,交换位置:  1  2  3  6  8  9

    第二趟总共进行了1次比较, 排序结果:  1  2  3  6  8  9

---------------------------------------------------------------------

最终结果:1  2  3  6  8  9

---------------------------------------------------------------------

由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即

for(int i=1;i<arr.length;i++){

    for(int j=1;j<arr.length-i;j++){

    //交换位置

}    

冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

用时间复杂度来说:

  1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数和记录移动次数均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

  2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为:O(n2) 。

综上所述:冒泡排序总的平均时间复杂度为:O(n2) 。

代码实现:

/*
 * 冒泡排序
 */
public class BubbleSort {
  public static void main(String[] args) {
    int[] arr={6,3,8,2,9,1};
    System.out.println("排序前数组为:");
    for(int num:arr){
      System.out.println(num);
    }
    for(int i=1;i<arr.length;i++){//外层循环控制排序趟数
      for(int j=1;j<arr.length-i;j++){//内层循环控制每一趟排序多少次
        if(arr[j-1]>arr[j]){
          int temp=arr[j];
          arr[j]=arr[j-1];
          arr[j-1]=temp;
        }
      }
    }
    System.out.println("排序后的数组为:");
    for(int num:arr){
      System.out.println(num);
    }
  }
}
时间: 2024-08-01 20:37:33

Java中的经典算法之冒泡排序(Bubble Sort)的相关文章

分享知识-快乐自己:Java中的经典算法之冒泡排序(Bubble Sort)

原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较: 第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比

Java中的经典算法之选择排序(SelectionSort)

Java中的经典算法之选择排序(SelectionSort) a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序.(这里只介绍常用的简单选择排序) b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据}:第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数

经典排序算法(1) - 冒泡排序Bubble Sort

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端.运作步骤如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后

【 python 学习笔记 -- 数据结构与算法 】冒泡排序 Bubble sort

推荐一个可视化的网站 [ Visual Algo ]: URL= 'https://visualgo.net/en/sorting' 这个网站给出了各种排序算法的原理和过程,通过动态形式直观得展现出来.另外还给出了相关的pseudo-code,以及具体执行到code的哪一步. [冒泡排序] 需要重复地走访需要排序的数列.走访过程中比较相邻两个items的大小,如果顺序不对,则交换两个items. 因此,每完成一次走访(pass),需要排序的部分的最大值就会移动到合适的位置. 这个过程看起来就像每

快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止.上述过程称为第一趟冒泡排序,接着第二趟对前面n-1个关键字进行同样操作,…… 快速排序是对冒泡排序的一种改进,通过一趟排序将记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,可分别对这两部分记录以递归的方法继续进行排序,以达到整个序列有序. 单趟Partition()函数过程请看

排序算法之冒泡排序(Bubble Sort)

基本思想 假如按照从小到大的顺序排序,对待排序数组进行遍历,如果当前值大于其后一个值则进行交换,不断的进行遍历,直到没有交换动作的发生.冒泡排序的最好时间复杂度为O(n),最坏的时间复杂度为O(n2),所以冒泡排序的平均时间复杂度为O(n2),另外冒泡排序不会改变相同元素的前后顺序,故其是一种稳定的排序算法. 实现代码 #include<iostream> using namespace std; int main() { int MyData[10] = { 7,3,12,46,32,64,

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

java冒泡排序Bubble Sort算法代码

java冒泡排序Bubble Sort算法代码 下载代码地址:http://www.zuidaima.com/share/1550463269096448.htm package com.zuidaima.util; /** *冒泡排序 *@paramsrc待排序数组 *@author www.zuidaima.com */ void doBubbleSort(int[] src) { int len=src.length; for(int i=0;i<len;i++) { for(int j=

java中一些经典的算法

package com.xfm.algorithm; import java.util.ArrayList;import java.util.List; /** * java中一些经典的算法(Algorithm) * @author xfm */public class ClassicJavaAlgorithm { /** * 问法一.斐波那契数 * 问法二.有一对兔子,从出生后第3个月起每个月都生一对兔子, * 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死, * 问每个月的兔子总数为