冒泡排序

冒泡排序基本思想:

冒泡排序是交换排序的一种,两两比较待排序的关键字,发现两个记录的次序相反时即进行交换。

在冒泡排序的过程中,关键字小的记录好比水中的气泡逐趟向上漂浮,而关键字大的记录好比石块往下沉,每一趟有一个最大的石头沉搭到水底。

 

排序过程:

首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即source[1].key>source[2].key),则交换两个记录。

以此类推,直到第n-1个记录和第n个记录的关键字进行比较,这个过程称作第一趟排序,其结果使得最大的记录被安置到最后一个记录的位置上。

 

冒泡排序效率

若初始序列为“正序”,则只需要进行一趟排序,在排序过程中进行n-1次关键字的比较,且不移动记录;

若初始序列为“逆序”,则需要进行n-1趟排序,在排序过程中进行n(n-1)/2次关键字的比较,并做等数量级的记录移动。

因此,总的时间复杂度为O(n2), 最好时间复杂度为O(n)。

冒泡排序稳定性:

在待排序的文件中,若存在多个关键字相同的记录,经过排序后,这些具有相同关键字的记录之间的相对次序保持不变,则称该方法是稳定的。

冒泡排序时就地排序,因此他是稳定的。

 

JAVA实现的冒泡排序:

public class BubbleSort {

 //bubbleSort 实现

 public static void bubbleSort(int[] source) {

  boolean flag = false;                                     //设置交换标志
  for(int i=source.length-1;i>0;i--) {
   for(int j=0; j<i; j++) {
    if (source[j] > source[j+1]) {
     swap(source, j, j+1);

    flag = true;                                               //表示在这趟排序过程中进行了交换
    }

    if(!flag) {                                                  //本趟排序未进行交换,提前返回

     return;

     }
   }
  }  
 }


 //交换函数swap
 public static void swap(int[] source, int i, int j) {
  int temp = source[i];
  source[i] = source[j];
  source[j] = temp;
 }

  //测试上面的bubbleSort方法
  
public static void main(String[] args) {
     int test[] = {23,5,21,2,2,2,43,54,6,77};
     bubbleSort(test);
     for(int i=0; i<test.length;i++) {
      System.out.println(test[i]);
     }
 }
}

 

输出结果:

2
2
2
5
6
21
23
43
54
77

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章