- 一、理解qsort函数
- 1.什么是qsort函数
- 2.qsort函数对数组排列
- 3.冒泡排序
- 4.冒泡排序使用冒泡排序模仿qsort实现通用算法
- 5.总结
qsort函数,是C语言中自带函数库中就有快速排序。
本篇文章用冒泡排序模拟实现qsort的功能,实现对数组、字符串、结构体等结构进行升序或降序排序。
一、理解qsort函数 1.什么是qsort函数功能: 使用快速排序例程进行排序
头文件:stdlib.h
使用方法:
void qsort(void* base,
size_t num,
size_t size,
int (*compar)(const void*, const void*));
参数 :
“base” 中存放待排序数据中第一个对象的地址
“num” 排序数据元素的个数
“size” 排序数据中一个元素的大小
compar是用来比较待排序数据中的2个元素的函数
简而言之:qsort函数可以根据用户提供的比较函数,将数组进行有序的排列。
代码如下:
- 建立比较函数
```c
int (*com_int)(const void*e1,const void*e2)
{
return *(int*)e1 - *(int*)e2;//(int*)进行类型转换后,解引用相减
}
- 建立打印函数
void print(int* p, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
}
- 建立主函数
int main()
{
//整型数据的排序
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//排序
qsort(arr, sz, sizeof(arr[0]), com_int);
//打印
print(arr, sz);
return 0;
}
3.冒泡排序
- 什么是冒泡排序
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。 - 图示分析
3.代码实现
void bubble(int *p,int sz)
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;
for (j = 0; j < sz - 1 - i; j++)//j < sz - 1 - i 后面交换完的不再交换节省时间
{
int tmp = 0;
if (*(p + j) > *(p + j + 1))
{
tmp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = tmp;
flag = 0;
}
}
if (flag == 1)//如果进入循环未产生交换则跳出循环
break;
}
}
主函数
int main()
{
int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
Bubble(arr, sz);
print(arr, sz);
return 0;
}
4.冒泡排序使用冒泡排序模仿qsort实现通用算法
在了解了qsort函数和冒泡排序之后,我们来运用冒泡排序实现qsort函数的功能。
- 创建交换函数。
Swap(char* buf1, char* buf2, int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
- 模仿qsort函数建立bubble_sort
为了使函数具有通用性,使用(char*)类型进行强制转换。
那么跳转到下一个元素的地址=现在地址+跳转的位数*每个元素的字节数
void bubble_sort(void* base,
int sz,
int size,
int (*compar)(const void*e1, const void*e2));
{
int i = 0;
for(i = 0 ;i <sz - 1;i++)
{
//一趟排序
int j = 0;
for(j = 0; j < sz - 1 - i; j++)
{
if(compar((char*)base+j*size, (char*)base+(j+1)*size )> 0)
{
//交换
Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
5.总结
以上就是使用冒泡排序模仿qsort实现通用算法,如有错误感谢指出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)