冒泡排序 - 基本实现

冒泡排序

        排序分为升序和降序,本文采用回调函数传入
        具体实现时可选择相应的排序。
时间复杂度 O(n^2)  
空间复杂度 O(1)
稳定性:比较稳定

排序规则以回调函数方式引入:

//排序规则
typedef int(*Compare)(int a, int b)

升序排序规则定义如下:

//升序排序规则
int Greater(int a, int b)
{
    return a>b?1:0 ;
}

降序排序规则定义如下:

//降序排序规则
int Less(int a, int b)
{
    return a<b? 1:0;
}

封装交换函数实现简易调用

//交换函数
void Swap(int *a , int *b)
{
    int tmp=*a;
    a*=*b;
    *b=tmp;
}

如果是升序排序:

        在每一轮排序中,最大的值会放到最高位,次高位(从前向后冒泡)
        或者每一次排序,最小值放在最低位,次低位(从后往前冒泡)
        经过多轮排序后就产生一个升序的序列

如果是降序排序

        在每一轮排序中,最小的值会放到最高位,次高位(从前向后冒泡)
        或者每一次排序,最大值放在最低位,次低位(从后往前冒泡)
        经过多轮排序后就产生一个降序的序列

从前往后冒泡

//[0,bound]  未排区间
//(bound, size)  已排区间   
void bubblesort(int arr[], uint64_t size, Compare cmp)
{
    if(arr[]==NULL||size<=1)
    {    //非法
        return ;
    }
    int bound=size-1; 
    for(;bound>0;bound--)
    {
        int cur=0;
        for(;cur<bound;cur++)
        {
            if(cmp(arr[cur],arr[cur+1])==1)
            {
                Swap(&arr[cur],&arr[cur+1]);
            }
        }
    }
    return ;
}

从后往前冒

//[0,bound)   已排区域
//[bound,size)   未排区域

void  Bubblesort(int arr[], uint64_t size , Compare cmp)
{
    if(arr[]==NULL||size<=1)
    {
        return ;
    }
    int bound=0;
    for(;bound<size-1;bound++)
    {
        int cur=size-1;
        for(;cur>bound;cur--)
        {
            if(cmp(arr[cur],arr[cur+1])==1)
            {
                Swap(arr[cur],arr[cur+1]);
            }
        }
    }
    return ;
}

猜你喜欢

转载自blog.csdn.net/yu876876/article/details/80857931