冒泡排序

博客园的第一篇博客,就先来记录一下最简单的冒泡排序吧。
冒泡排序是交换排序的一种,下面是冒泡排序的一些特征:

  • 平均时间复杂度:O(n^2)
  • 最坏情况:O(n^2)
  • 最好情况:O(n)
  • 平均空间复杂度,最好最坏平均都为:O(1)
  • 是否稳定:稳定

冒泡排序的一次循环会将一个最小的元素放到排好序的最终位置上

话不多说,函数代码如下:

/**
* arr 为需要排序的数组名
* len 为数组长度
*/
void bubble_sort(int arr[], int len)
{
    int i, j;
    int flag = 0;	// 标记一趟过后是否有元素交换
    for (i=0; i<len-1; i++) {
        flag = 0;
        for (j=len-1; j>i; j--) {
            if (arr[j-1] > arr[j]) {// 如果前者比后者大,则交换两者
                int temp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = temp;
                
                flag = 1;           // 标记有元素交换过了
            }
        }
        if (!flag)	// 若一趟过后元素未交换过,说明已经排好序
            break;
    }
}

简单的测试代码如下,直接保存代码编译即可:

#include <stdio.h>

/**
* arr 为需要排序的数组名
* len 为数组长度
*/
void bubble_sort(int arr[], int len)
{
    int i, j;
    int flag = 0;	// 标记一趟过后是否有元素交换
    for (i=0; i<len-1; i++) {
        flag = 0;
        for (j=len-1; j>i; j--) {
            if (arr[j-1] > arr[j]) {// 如果前者比后者大,则交换两者
                int temp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = temp;
                
                flag = 1;           // 标记有元素交换过了
            }
        }
        if (!flag)	// 若一趟过后元素未交换过,说明已经排好序
            break;
    }
}

void show(int arr[], int len)
{
    int i;
    for (i=0; i<len; i++) {
        printf("%4d", arr[i]);
    }
    printf("
");
}

int main()
{
    int n = 4;
    int arr[] = {7, 10, 11, 9};
    bubble_sort(arr, n);
    show(arr, n);
    return 0;
}
原文地址:https://www.cnblogs.com/qijinzhi/p/bubble_sort.html