冒泡排序函数函数原型:
void bubble(void *base, size_t num, size_t width, int(*compare)(const void *num1, const void *num2));
功能:使用冒泡法排序对任意类型的数据排序
参数:1、待排序的数组的首地址
2、数组中待排序元素的个数
3、各元素占用空间的大小
4、指向比较函数的指针,用于确定排序的顺序
compare函数的原型:int compare(const void *elem1,const void *elem2)
compare函数的返回值 | 描述 |
小于0 | elem1将排在elem2的前面 |
等于0 | elem1等于elem2 |
大于0 | elem1将排在elem2的后面 |
以下只简单写出×××数组和字符串数组的比较函数,其他比较函数见本人博客的有关快排的比较函数的介绍,这两种排序的比较函数完全相同。(详见http://10740026.blog.51cto.com/10730026/1717611)
#include <stdio.h> #include <stdlib.h> #include <string.h> /*×××数组比较函数*/ int IntCmp(const void *num1, const void *num2) { return ((*(int *)num1) > (*(int *)num2)) ? 1 : -1; } /*字符串数组比较函数*/ int StrCmp(const void*num1, const void *num2) { return (strcmp((char *)(*(int *)num1), (char *)(*(int*)num2)) > 0) ? 1 : -1; } /*交换函数*/ void swap(size_t width, void *num1, void *num2) { char tmp; for (int k = 0; k < (int)width; k++) { tmp = *((char *)num1 + k); *((char *)num1 + k) = *((char *)num2 + k); *((char *)num2 + k) = tmp; } } /*冒泡排序*/ void bubble(void *base, size_t num, size_t width, int(*compare)(const void *num1, const void *num2)) { int ret = 0; for (int i = 0; i < (int)num - 1; i++) { for (int j = 0; j < (int)num - 1 - i; j++) { ret = compare(((char *)base + j*width), ((char *)base + (j + 1) * width)); if (ret > 0) { swap(width, ((char *)base + j*width), ((char *)base + (j + 1)*width)); } } } } int main() { //×××数组的比较 /* int arr[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 }; bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), IntCmp); for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } */ //字符串数组的比较 char *arr[4] = { "aaa", "ccc", "ddd", "bbb" }; bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), StrCmp); for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%s ", arr[i]); } printf("\n"); system("pause"); return 0; }