一、冒泡排序的基本思想

冒泡排序(Bubble Sort)是一种简单直观的排序算法。它的原理是重复地造访要排序的数列,一次比较两个相邻元素,假如它们的顺序不是预期的顺序就交换它们。这个进程继续进行,直到没有再需要交换,也便是说该数列现已排序完成。

二、实例解说

【每天一个算法】冒泡排序算法

【每天一个算法】冒泡排序算法

【每天一个算法】冒泡排序算法

【每天一个算法】冒泡排序算法

第四轮往后,将第四大的元素位置确定,此时总共5个元素,现已排序好4个,从而最终一个自然而然便是排好序的了

三、算法步骤总结

设总的元素个数为n,那么由上边的排序进程能够看出:

(1)总计需要进行(n-1)轮排序,也便是(n-1)次大循环

(2)每轮排序比较的次数逐轮削减

(3)假如发现在某趟排序中,没有发生一次交换, 能够提前结束冒泡排序。(详见下边优化部分)

四、代码实现

#include <stdio.h>
voidbubble_sort(intarr[],intlen) {
    inti,j,temp;
    for (i=0;i<len-1;i++) {
        for (j=0;j<len-1-i;j++) {
            if(arr[j]>arr[j+1]) {
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
}
intmain() {
    intarr[]= {
        22,34,3,32,82,55,89,50,37,5,64,35,9,70
    };
    intlen=sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr,len);
    for (int i=0;i<len;i++){
        printf("%d ",arr[i]);
    }
    return0;
}

五、算法优化

通过上边解说的例子,咱们也能够看出从第二轮往后,其实数组现已是有序的了,但是按照算法步骤来走的话,即便现已排好序了,但仍是会进行后边的比较,知道全部比较完成。

因此,咱们能够对代码进行优化,假如发现在某趟排序中,没有发生一次交换, 能够提前结束冒泡排序。

解决方法:能够通过一个标志位来进行判断

下面是优化后的代码:

#include <stdio.h>
voidbubble_sort(intarr[],intlen) {
    inti,j,temp;
    for (i=0;i<len-1;i++) {
        int swap_flag = false;
        for (j=0;j<len-1-i;j++) {
            if(arr[j]>arr[j+1]) {
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
                swap_flag = true;
            }
        }
        if(!swap_flag){
            break;
        }
    }
}
intmain() {
    intarr[]= {
        22,34,3,32,82,55,89,50,37,5,64,35,9,70
    };
    intlen=sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr,len);
    for (int i=0;i<len;i++){
        printf("%d ",arr[i]);
    }
    return0;
}