冒泡排序

本文详细介绍了冒泡排序的基本思想、排序过程、效率分析以及稳定性。冒泡排序通过两两比较并交换,使得最大元素逐步下沉。时间复杂度为O(n^2),在正序情况下最好时间复杂度为O(n)。此外,文章还提供了一个简单的Java实现示例,用于演示冒泡排序的代码逻辑。

冒泡排序基本思想:

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

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

 

排序过程:

首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值