美文网首页
冒泡排序(bubble sort)

冒泡排序(bubble sort)

作者: 水中的蓝天 | 来源:发表于2022-08-16 10:31 被阅读0次
    10大排序算法.png

    冒泡排序也叫起泡排序,一般用于对无序数组进行排序;同时冒泡算法属于稳定排序,也具备原地算法特征

    假设给定一个无序数组 [1,3,2,5,4,30,10,44,67,33], 请你输出一个升序数组
    执行流程:

    1. 从头开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置;如此执行完一轮后 最末尾的那个就是最大的元素
      2.忽略1中曾经找到的最大元素,重复执行步骤1的操作,直到全部元素都有序

    代码表示

    int[] list = {1,3,2,5,4,30,10,44,67,33};
    int length = list.length - 1;
    
    //end只需要大于0即可,因为剩下最后一个不需要再比
    for(int end = length; end > 0;end--) {
       //begin等于1是因为要跟begin-1对比
        for(int begin = 1;begin <= end;begin++) {
            if(list[begin] < list[begin-1] ) {
               //交换
               int tmp = list[begin];
               list[begin] = list[begin-1];
               list[begin-1] = tmp;
           }
        }
    }
    
    

    优化方案1:其实只要在某一趟扫描完发现没有需要交换的元素了,就可以结束循环了

    
    int[] list = {1,3,2,5,4,30,10,44,67,33};
    int length = list.length - 1;
    
    //end只需要大于0即可,因为剩下最后一个不需要再比
    for(int end = length; end > 0;end--) {
       boolean sorted = true;
       //begin等于1是因为要跟begin-1对比
        for(int begin = 1;begin <= end;begin++) {
            if(list[begin] < list[begin-1] ) {
               //交换
               int tmp = list[begin];
               list[begin] = list[begin-1];
               list[begin-1] = tmp;
               sorted = false;
           }
        }
      //已经有序就跳出循环
      if(sorted) break;
    }
    
    

    优化方案2:因为一轮循环结束后出现完全排好序的概率并不高,但如果序列尾部已经局部有序,可以记录最后一次交换的位置,减少比较次数

    
    最坏平均时间复杂度: O(n^2)
    最好时间复杂度:O(n)
    空间复杂度:O(1)
    
    int[] list = {1,3,2,5,4,30,10,44,67,33};
    int length = list.length - 1;
    
    //end只需要大于0即可,因为剩下最后一个不需要再比
    for(int end = length; end > 0;end--) {
    
       int sortedIdx = 1;//sortedIdx的初始值在数组完全有序的时候有用
       //begin等于1是因为要跟begin-1对比
        for(int begin = 1;begin <= end;begin++) {
            if(list[begin] < list[begin-1] ) {
               //交换
               int tmp = list[begin];
               list[begin] = list[begin-1];
               list[begin-1] = tmp;
               sortedIdx = begin;
           }
        }
      //一轮结束后就更新,使end保持最后无序的位置
      end = sortedIdx;
    }
    
    

    相关文章

      网友评论

          本文标题:冒泡排序(bubble sort)

          本文链接:https://www.haomeiwen.com/subject/iidfirtx.html