zoukankan      html  css  js  c++  java
  • 冒泡排序

    冒泡排序应用了交换排序的基本思想:两两比较待排序记录,发现两个记录的次序相反则交换,直到没有反序的记录为止。

    冒泡排序算法的基本思想:

      把每个数据看成一个气泡,按初始顺序自底向上依次对两两气泡进行比较,对上重下轻的气泡交换顺序(这里用气泡轻、重表示数据大、小),保证轻的气泡总能浮在重的气泡上面,直到最轻的气泡浮到最上面;保持最后浮出的气泡不变,对余下气泡循环上述步骤,直到所有气泡从轻到重排列完毕。

      因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。

      优化:若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下,因此,冒泡排序过程可在此趟排序后终止。在下面给出的实现代码中,引入boolean标记isSwap,在每趟排序开始前,先将其置为false。若排序过程中发生了交换,则将其置为true。各趟排序结束时检查,若未曾发生过交换则终止算法,不再进行下一趟排序。

       时间复杂度:冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算,对于n位的数组则有比较次数为 (n-1) + (n-2) + ... + 1 = n * (n - 1) / 2,这就得到了最大的比较次数,冒泡排序的最坏时间复杂度为O(n2)。若数组的初始状态是已经排好序的,一趟扫描即可完成排序。所需的关键字比较次数为n-1,冒泡排序最好的时间复杂度为O(n)

     1 package com.bingoogol.algorithm.sort;
     2 
     3 /**
     4  * 冒泡排序
     5  * 
     6  * @author bingoogol@sina.com
     7  */
     8 public class BubbleSort {
     9 
    10     public static void main(String[] args) {
    11         int[] arr = new int[] { 2, 6, 30, 25, 9, 18, 13 };
    12         System.out.print("排序前:");
    13         BubbleSort.printArr(arr);
    14         BubbleSort.sort(arr);
    15         System.out.print("排序后:");
    16         BubbleSort.printArr(arr);
    17     }
    18 
    19     public static void sort(int[] arr) {
    20         for (int i = 0; i < arr.length - 1; i++) {
    21             boolean isSwap = false;
    22             // 自下向上扫描
    23             for (int j = arr.length - 1; j > i; j--) {
    24                 if (arr[j] < arr[j - 1]) {
    25                     isSwap = true;
    26                     BubbleSort.swap(arr, j, j - 1);
    27                 }
    28             }
    29             if (!isSwap) {
    30                 return;
    31             }
    32         }
    33     }
    34 
    35     public static void swap(int[] data, int i, int j) {
    36         int temp = data[i];
    37         data[i] = data[j];
    38         data[j] = temp;
    39     }
    40 
    41     public static void printArr(int[] arr) {
    42         for (int i = 0; i < arr.length - 1; i++) {
    43             System.out.print(arr[i] + ",");
    44         }
    45         System.out.println(arr[arr.length - 1]);
    46     }
    47 }
    查看Java语言版代码
  • 相关阅读:
    浏览器事件.html
    奇数(11~99)四个一行输出.html
    JDBC系列教材 (十一)- 数据库连接池
    JDBC系列教材 (十)- 基于JDBC设计DAO的实例
    JDBC系列教材 (九)- 使用JDBC做一个ORM例子
    JDBC系列教材 (八)- 如何在JDBC中使用事务
    JDBC系列教材 (七)- 获取自增长id以及表的元数据
    JDBC系列教材 (六)- 中execute与executeUpdate的区别
    JDBC系列教材 (五)- 在JDBC中使用预编译Statement 以及它的优点
    JDBC系列教材 (四)- 在JDBC中使用ResultSet查询SQL语句
  • 原文地址:https://www.cnblogs.com/bingoogol/p/sort-bubble.html
Copyright © 2011-2022 走看看