冒泡排序

Bubble Sort
说明
. 小的数据浮上来|到序列前面;大的数据沉下去|到序列后面
. 从0开始,比较相邻的2个数据项
. 如果前者大于后者,就 立即 交换位置;否则保持不动
. 后移1位,继续比较相邻的2个数据项
. 每趟比较结束后,将最大的数据放到最后
. 第1趟,比较次数为 n - 1;第2趟比较次数为 n - 2;依次类推
. 共需要 n - 1 趟排序
Bubble Sort
求序列{8,6,9,2,3,7}的冒泡排序过程
冒泡排序过程
原始数据 8 6 9 2 3 7
第1轮比较 6 8 2 3 7 9
第2轮比较 6 2 3 7 8 9
第3轮比较 2 3 6 7 8 9
第4轮比较 2 3 6 7 8 9
第5轮比较 2 3 6 7 8 9
求序列{49,38,65,97,76,13,27,49}的冒泡排序过程
初始序列
0 1 2 3 4 5 6 7
49 38 65 97 76 13 27 49
第1趟冒泡
0 1 2 3 4 5 6 7
38 49 65 76 13 27 49 97
第2趟冒泡
0 1 2 3 4 5 6 7
38 49 65 13 27 49 76 97
第3趟冒泡
0 1 2 3 4 5 6 7
38 49 13 27 49 65 76 97
第4趟冒泡
0 1 2 3 4 5 6 7
38 13 27 49 49 65 76 97
第5趟冒泡
0 1 2 3 4 5 6 7
13 27 38 49 49 65 76 97
第6趟冒泡
0 1 2 3 4 5 6 7
13 27 38 49 49 65 76 97
第7趟冒泡
0 1 2 3 4 5 6 7
13 27 38 49 49 65 76 97
代码实现
. 需要双重循环实现
冒泡排序
#include <stdio.h>
void swap(int *a, int *b){
    int temp;
    if(*a > *b){
        temp = *a;
        *a = *b;
        *b = temp;
    }
}
void dis(int arr[], int len){
    int i = 0;    
    for(; i < len; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}
int main () {
    int arr[] = {49,38,65,97,76,13,27,49};
    int index = 0, len = sizeof(arr)/sizeof(arr[0]);
    dis(arr, len);
    for(; index < len-1; index++){
        int j=0;
        for(; j < len-1-index; j++){
            if(arr[j] > arr[j+1]){
                swap(&arr[j], &arr[j+1]);
            }
        }
        printf("第%d趟冒泡 ", index + 1);
        dis(arr, len);
    }
    return 0;
}
性能分析 Analysis
. 正序情况:O(N)
. 反序情况:O(N2)
. 平均时间复杂度:O(N2)
. 更多信息,请查看 懒猫老师
改进
. 使用一个标记flag来标记本趟有没有交换;如果没有,说明数据已经有序,提前推出外层循环