美文网首页
冒泡排序

冒泡排序

作者: 定一 | 来源:发表于2020-05-13 00:09 被阅读0次

    冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
    冒泡排序:
    有两种,
    一种是小泡向上冒,
    一种是大泡向下沉。
    首先,设待排序长为n,
    从后往前(从前向后)两两比较相邻元素的值,若为逆序, (a[i-1]>a[i]),则交换他们,直到序列比较结束。

    • 例子(大泡下沉,即从前向后比较)

    交换过程中,会将较大的元素一直向后移动,故,会将最大的元素移动到最终的位置上

    image.png

    这样就称为一次冒泡过程

    需要多少次冒泡过程?:

    一共需要n-1次冒泡,就可以将序列变成递增的序列

    为啥是n-1呢
    因为排到最后,只剩两个数了,我们只需要比较一次,即可得到这两个数的有序序列。

    需要比较多少次?:

    一共比较了(等差数列求和公式)次:n*(n-1)/2.

    9个数第一次需要比较8次,因为当只有两个数的时候,比较一次即可排出顺序。且每次比较都会少比较一次,因为每次比较都会使得一个数归位。所以一共比较8+7+6+5+4+3+2+1次,
    冒泡排序是死的次数,最坏最好的情况冒泡排序都会进行相邻的比较。区别在于最好的情况每次比较不交换元素,最坏的情况每次都会交换相邻元素而已

    #include<stdio.h>
    void bubbleSort(int *arr,int n)
    {
        int m,i,j;
        for(i=0;i<n-1;i++)
            for(j=0;j<n-1-i;j++)
                if(arr[j]>arr[j+1])
                {
                    m=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=m;
                }
    }
    int main(){
        int arr[]={9,7,5,4,3,2};
        bubbleSort(arr,6);
        int i;
        for(i=0;i<6;i++){
            printf("%d\n",arr[i]);
        }
        return 0;
    }
    
    image.png
    代码分析:
    for(i=0;i<n-1;i++){
            for(j=0;j<n-1-i;j++){
      }
    }
    首先i<n-1保证了循环执行0~n-2次,
    
    循环结束条件是i>=n-1,当i=n-1时,就结束了,所以一共执行了i从0到n-2,合计为n-1次冒泡。
    然后就是
    当i=0的时候,需要比较n-1次,就想到了n-1
    就是j<n-1很正常,然后为什么要-i呢?
    因为根据上述分析知道,每冒泡一次,就有一个数归位,
    每次冒泡排序的次数就减少1,所以i每+1,j就要-1。
    
    i控制冒泡次数,
    j控制每次冒泡需要的排序次数。
    
     *arr运用指针,使得传过来的值都是实参和形参都一致???那个怎么说来着。
    
    • 从后向前比较的代码:

    通过设计flag来减少冒泡的次数。

    相关文章

      网友评论

          本文标题:冒泡排序

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