(一篇学习代码)
仿照qsort函数的功能,实现冒泡排序
#include<stdio.h>
#include<string.h>
//qsort函数实现
//
//如果指针p1指向的值大于指针p2指向的值,则返回值大于0,
// 相等,返回0,
// 小于,返回值小于0
int cmp_int(const void *p1,const void *p2)
{return *(int*)p1 - *(int *)p2;
}
int cmp_char(const void* p1, const void* p2)
{return strcmp((char*)p1, (char*)p2);
}//元素交换函数
void swap(const void*p1,const void*p2,size_t width)
{//一个字节一个字节的交换for (int i = 0; i < width; i++){char tmp = *((char*)p1 + i);*((char*)p1 + i) = *((char*)p2 + i);*((char*)p2 + i) = tmp;}
}
//冒泡排序
//*base:要比较的元素的指针
//sz:元素个数
//width:元素的大小
//cmp:比较的方法
void bubble_sort( void* base, size_t sz, size_t width,int (*cmp)(const void*p1,const void*p2))
{for (int i = 0; i < sz-1; i++){//1.一趟冒泡排序for (int j = 0; j < sz -1 - i; j++){//2.趟内部排序//把*base通过强制类型转换变为char*,因为char*所占的字节大小为1//将void*指针所指向的元素拆分成一个字节为单位的每一小份,进行比较if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){swap((char*)base + j * width, (char*)base + (j + 1) * width,width);}}}
}
//打印整型数组的函数
void print_int(int* arr,size_t sz)
{for (int i = 0; i < sz; i++){printf("%d", arr[i]);}printf("\n");
}
//打印字符型数组的函数
void print_char(char* arr, size_t sz)
{for (int i = 0; i < sz; i++){printf("%c", arr[i]);}printf("\n");
}
int main()
{int arr1[] = { 8,5,6,7,4,2,3,1,9 };char arr2[] = "bdeafc" ;size_t sz1 = sizeof(arr1) / sizeof(arr1[0]);size_t sz2 = strlen(arr2);bubble_sort(arr1, sz1, sizeof(arr1[0]), cmp_int);print_int(arr1, sz1);bubble_sort(arr2, sz2, sizeof(arr2[0]), cmp_char);print_char(arr2, sz2);return 0;
}