思路:仿照qsort函数运用函数指针实现排序整形数组、排序字符串的功能。
首先,编写整形数组比较函数和字符串比较函数;
其次,仿照qsort函数将首元素地址、元素个数、元素大小、比较函数 传参编写熟悉的冒泡排序函数;
最后,举例验证函数正确性。
/******************************/ //1.编写冒泡排序,可以排序整形数组,也可以排序字符串。 #include<stdio.h> #include<stdlib.h> #include<assert.h> void bobble(const void *base, int length, int width, int(*fcmp)(const void *a, const void *b))//(*fcmp)()函数指针 { assert(base);//断言 int i = 0, j = 0, k = 0; char *arr = (char *)base; char temp=‘\0‘; for (i = 0; i < length - 1; i++) for (j = 0; j < length - i - 1; j++) { if ((*fcmp)(arr, arr + width * j)>0)//传参 将该元素地址与下一元素地址传入函数 { for (k = 0; k < width * j; k++)//运用循环在内存中实现对两元素进行交换 { temp = *(arr + k); *(arr + k) = *(arr + k + width * j); *(arr + k + width * j) = temp; } } } } int int_cmp1(const void *a, const void *b) { assert(a); assert(b); return *(int *)a - *(int *)b; } int str_cmp(const void *a, const void *b) { assert(a); assert(b); char *arr1 = (char *)a; char *arr2 = (char *)b; while (*arr1&&*arr2&&*arr1++ == *arr2++) ; return *(arr1 - 1) - *(arr2 - 1); } int main() { int str1[] = { 1,5,0,2,4,7,9,6,3,5,6 ,16,155,26}; int size = sizeof(str1) / sizeof(str1[0]); char str2[][30] = { "abcd","3456","cdef","1234" ,"abce"}; int size_str = sizeof(str2) / sizeof(str2[0]); int i = 0; qsort(str1, size, sizeof(str1[0]), int_cmp1);//用快排函数结果作比较 for (i = 0; i < size; i++) printf("%d ", str1[i]); printf("\n"); bobble(str1, size, sizeof(str1[0]), int_cmp1); for (i = 0; i < size; i++) printf("%d ", str1[i]); printf("\n"); qsort(str2, size_str, sizeof(str2[0]), str_cmp);//用快排函数结果作比较 for (i = 0; i < size_str; i++) printf("%s\n", str2[i]); bobble(str2, size_str, sizeof(str2[0]), str_cmp); for (i = 0; i < size_str; i++) printf("%s\n", str2[i]); system("pause"); return 0; }
<笔试><面试>编写一个排序函数,实现,既可以排序整形数组,又可以排序字符串。
原文地址:http://10739786.blog.51cto.com/10729786/1717270