【C-排序算法】冒泡排序

原理


如果有n个元素,就找n-1次,每次冒泡出最大值

  • 从头遍历,如果后一个元素大于当前元素,就交换

  • 每次遍历完后最后一个元素就是最大值,长度减一,找剩余元素最大值,直到数量为2时



性能


时间复杂度:最坏和平均的是O(n^2),最好的是O(n)

空间复杂度:O(1),是原地排序算法

由于较高时间复杂度,不适合大规模数据的排序。实际开发中,常用更高效的排序算法(快排、堆排、归并、计数等)。





代码


1.0

输入:数组地址,数组长度

输出:升序排列的数组


bubble_sort.c

//传入数组地址,数组长度
void bubble_sort(int *arr, int len)
{
    //排序
    //i 表示查找的范围
    //j 表示冒泡的起始位置
    for (int i = len; i > 1; --i) {
        for (int j = 0; j < i - 1; ++j) {
            if (arr[j] > arr[j + 1]) {
                //比后一个元素大,交换值
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}


2.0(迭代器版)

输入:数组第一个元素的地址,数组最后一个元素的下一个地址

输出:升序排列的数组

bubble_sort2.c

//传入数组首尾地址
void bubble_sort2(int *begin, int *end)
{
    int len = 0;
    int *start = begin;
    for (; start != end; ++start) {
        ++len;
    }
    
    //排序
    //i 表示查找的范围
    //j 表示冒泡的起始位置
    for (int i = len; i > 1; --i) {
        for (int j = 0; j < i - 1; ++j) {
            if (begin[j] > begin[j + 1]) {
                //比后一个元素大,交换值
                int tmp = begin[j];
                begin[j] = begin[j + 1];
                begin[j + 1] = tmp;
            }
        }
    }
}

test_sort.c

#include <stdio.h>

void bubble_sort(int *arr, int len);
void bubble_sort2(int *begin, int *end);

//打印数组
void print_arr(int *begin, int *end)
{
    int *start = begin;
    for (; start != end; ++start) {
        printf("%d ", *start);
    }
    printf("\n");
}

void test_bubble()
{
    int arr[] = { 4, 3, 9, 2, 7, 8, 0, 1 };
    int len = sizeof(arr) / sizeof(arr[0]);

    /* bubble_sort(arr, len); */
    bubble_sort2(arr, arr + len);
    print_arr(arr, arr + len);
}


int main()
{
    test_bubble(); 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值