void Bubble_sort(void*base,size_t num,size_t width,int(*cmp)(const void*p1,const void*p2))
{
for (int i = 0; i < num - 1; ++i)
{
int flag = 0;
for (int j = 0; j < num - 1 - i; ++j)
{
if()
{
}
}
if (!flag)
break;
}
}
冒牌排序外壳:
趟数、比较次数不用改变
2.2.2.1条件判断
if 语句中,根据函数调用返回值进行判断
假设,当当p1指向的内容大于p2时,才进行数据的交换
那么,代码如下:
复制代码
void Bubble_sort(void*base,size_t num,size_t width,int(*cmp)(const void*p1,const void*p2))
{
for (int i = 0; i < num - 1; ++i)
{
int flag = 0;
for (int j = 0; j < num - 1 - i; ++j)
{
if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
{
flag = 1;
..
}
}
if (!flag)
break;
}
}
详细解释:
(1)绿色方框框起来的意思是
(1.1)这是两个实参
(1.2)指针指向一种数据时,
总是指向该数据所占空间地址最小的那个字节
(1.3)base接收了数组首元素的地址,但是
我并不知道这是整型、浮点型、字符型的数组
所以我将它强制转换为(char*)类型的指针
这样,无论如何
(char*)base 都指向了数组首元素的第一个字节
(1.4)函数传参传进了width,
注意到:
如果是一个int型的数组
(char*)base 指向了数组首元素 的第一个字节
(char*)base+width 指向了数组第二个元素 的第一个字节
(char*)base+2*width 指向了数组第三个元素的第一个字节
如果是一个char型的数组
(char*)base 指向了数组首元素
(char*)base+width 指向了数组第二个元素
(char*)base+2*width 指向了数组第三个元素
所以:
实参就是
复制代码
((char*)base+j*width,(char*)base+(j+1)*width)
(2)橙色方框框起来的意思是
调用cmp函数
(3)红色方框框起来的意思是
当cmp函数返回值>0时,才进行后续的操作
2.2.2.2交换方式
避免代码冗余,创建一个Swap函数进行数据的交换
复制代码
void Bubble_sort(void*base,size_t num,size_t width,int(*cmp)(const void*p1,const void*p2))
{
for (int i = 0; i < num - 1; ++i)
{
int flag = 0;
for (int j = 0; j < num - 1 - i; ++j)
{
if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
{
flag = 1;
Swap((char*)base+j*width,(char*)base+(j+1)*width, width);
}
}
if (!flag)
break;
}
}