冒泡排序

2020-05-13  本文已影响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来减少冒泡的次数。

上一篇 下一篇

猜你喜欢

热点阅读