冒泡排序过程详解

目录

一、基本思想

二、过程示意图

三、代码实现过程

四、算法改进

五、复杂度


一、基本思想

            冒泡排序是交换排序中一种简单的排序方法。它的基本思想是对所有相邻记录的关键字值进行比效,如果是逆序则将其交换,最终达到有序化。其处理过程为: 

对序列从后向前依次将相邻记录的关键字进行比较,若逆序(arr[j]<arr[j-1])则将其交换,从而使得关键字值小的记录向上"飘浮"(左移),关键字值大的记录好像石块,向下“堕落”(右移)。 即:


每经过一趟冒泡排序,都使原序列中关键字值最大的记录进入有序区,对于由n个记录组成的记录序列,最多经过n-1趟冒泡排序,就可以将这n个记录重新按关键字顺序排列。

二、过程示意图

 

三、代码实现过程

 /**
     * 冒泡排序
     */
    void bubbleSort(int arr[],int len){
        int i,j,temp,c1=0,c2=0;
        for(i=0;i<len-1;i++){//i是比较次数
            for(j=len-1;j>i;j--){//这里是从后往前比,实际从前到后都可以
                c1++;
       /*如果前面的大,则交换位置,把小的放前面,直到找出最小的放在最前面*/
                if(arr[j]<arr[j-1]){
                    temp=arr[j]; 
                    arr[j]=arr[j-1];
                    arr[j-1]=temp;
                    c2++;
                }
            }
        }
        System.out.println("比较"+c1+"次,"+"移动"+c2+"次");
    }

四、算法改进

用flag变量标记是否发生交换,如果没有交换则说明已经排好序了,就不用在继续比较了,此时flag=flase,结束循环,通过比较没有改进和改进后的c1和c2,会发现改进后的效率高。

/**
     * 冒泡排序改进
     */
    void bubbleSort2(int arr[],int len){
        int i,j,temp,c1=0,c2=0;
        boolean flag=true;
        for(i=0;i<len-1 && flag;i++){
            flag=false;
            for(j=len-1;j>i;j--){
                c1++;
                if(arr[j]<arr[j-1]){
                    c2++;
                    temp=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=temp;
                    flag=true;
                }
            }
        }
        System.out.println("比较"+c1+"次,"+"移动"+c2+"次");
    }

五、复杂度

空间上只用了一个辅助单元,时间上最好的情况是已经有序了,这样就不用交换,只在第一趟比较n-1次。最坏的情况就是刚好逆序,比如我要1,2,3,4但是序列是4,3,2,1。。。这样的话就要排n-1趟了,第1趟要交换n-1次,第i趟交换n-i次。所以:

总次数=1/2n(n-1)

所以复杂度=O(n^{2})

上面说的是未改进的,接着说改进后的

有些序列可能是3,42,4,66,67,68,这样66,67,68就不用再比较了啊,已经有序了,所以改进后减少了代码执行次数,提高了效率。但是

复杂度依然=O(n^{2}),hhh。。  因为虽然比n-1趟少,但还是用n表示,比较次数也是n表示。当序列非常大的时候应该能体现出来区别。

 

-----------------------------------我是分割线----------------------------------------------

 

...........emmm自己作图花的时间好多啊,我决定

                                 下次一定不自己作图了(

 

 

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冒泡排序-排序过程 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。 算法示例 49 13 13 13 13 13 13 13 38 49 27 27 27 27 27 27 65 38 49 38 38 38 38 38 97 65 38 49 49 49 49 49 76 97 65 49 49 49 49 49 13 76 97 65 65 65 65 65 27 27 76 97 76 76 76 76 49 49 49 76 97 97 97 97 Procedure BubbleSort(Var R : FileType) //从下往上扫描的起泡排序// Begin For I := 1 To N-1 Do //做N-1趟排序// begin NoSwap := True; //置未排序的标志// For J := N - 1 DownTo 1 Do //从底部往上扫描// begin If R[J+1]< R[J] Then //交换元素// begin Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp; NoSwap := False end; end; If NoSwap Then Return//本趟排序中未发生交换,则终止算法// end End; //BubbleSort// 该算法的时间复杂性为O(n2),算法为稳定的排序方 冒泡排序-冒泡排序法的改进 比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,可以不再进行比较了。因而第三趟比较还需要进行,但第四、五趟比较则是不必要的。为此,我们可以考虑程序的优化。 为了标志在比较中是否进行了,设一个布尔量flag。在进行每趟比较前将flag置成true。如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值