目录
一,冒泡函数
- 以下函数只针对整型数组
//冒泡排序
void BubbleSort(int* p, int sz)
{
int i = 0;
for (i; i < sz - 1; i++)
{
int j = 0;
int flag = 0;
for (j; j < sz - 1 - i; j++)
{
if (*(p + j) > *(p + j + 1))
{
int tmp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = tmp;
flag = 1;
}
}
if (0 == flag)
break;
}
}
int main()
{
int arr[] = { 9,8,7,6,5,1,2,3,4 };
int sz = sizeof arr / sizeof arr[0];
BubbleSort(arr, sz);
return 0;
}
二,qsort 库函数
- 可快速排序;
- 无排序类型限制;
- 是回调函数;
void qsort ( void* base,size_t num,size_t size,int(*cmp)(const void *,const void *) )
- void *base,目标数组的起始位置,即首元素地址,如arr;
- size_t num,目标数组元素的个数,如sizeof arr/sizeof arr[0];
- size_t size,目标数组每个元素的字节大小,如sizeof arr[0];
- int(*cmp)(const void *, const void *),用于目标数组中元素比较的函数指针;
- 可比较任意类型数据,如int arr,float arr,struct stu等;
void* 类型指针
- 可接收任意类型的地址,不可解引用操作;
- 需强制类型转换,才可解引用;
//qsort库函数的应用
#include <stdlib.h>
int cmp(const void* elm1, const void* elm2)
{
return *((int*)elm1) - *((int*)elm2);
}
int main()
{
int arr[] = { 9,8,7,6,5,1,2,3,4 };
int num = sizeof arr / sizeof arr[0];
int width = sizeof arr[0];
qsort(arr, num, width, cmp);
return 0;
}
//模拟实现qsort库函数
#include <stdlib.h>
void my_qsort(void* base, size_t num, size_t size, int(*cmp)(const void*, const void*))
{
int i = 0;
for (i; i < num - 1; i++)
{
int j = 0;
int flag = 0; //如一趟都没有交换,即已经排完序,无需再排序,跳出循环;
for (j; j < num - 1 - i; j++)
{
//比较函数
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
{
//直接交换每个字节数据
int k = 0;
for (k; k < size; k++)
{
char tmp = *((char*)base + j * size + k);
*((char*)base + j * size + k) = *((char*)base + (j + 1) * size + k);
*((char*)base + (j + 1) * size + k) = tmp;
}
flag = 1;
}
}
if (0 == flag)
break;
}
}
int cmp(const void* elm1, const void* elm2)
{
return *((int*)elm1) - *((int*)elm2);
}
int main()
{
int arr[] = { 9,8,7,6,5,1,2,3,4 };
int num = sizeof arr / sizeof arr[0];
int size = sizeof arr[0];
my_qsort(arr, num, size, cmp);
return 0;
}