冒泡排序
排序分为升序和降序,本文采用回调函数传入
具体实现时可选择相应的排序。
时间复杂度 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 ;
}